1.生成一个中间件

生成一个test中间件

php artisan make:middleware TestMiddleware

中间件类默认存放在app/Http/Middleware目录下。

中间件一般分before和after两种
before:
主要用于前置判断,比如用户登录验证、CSRF认证等

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // 执行业务逻辑操作

        return $next($request);
    }
}

after:
主要用于后期扫尾操作,比如设置cookie、记录日志等

<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // 执行动作

        return $response;
    }
}

这里举一个 before 开启 session 最后 after 关闭session并设置session_id到cookie的例子:

public function handle($request, Closure $next)
{
    $this->sessionHandled = true;

    //如果session驱动已配置,那么我们需要开启session以便为应用准备好数据
    //注意Laravel session并没有使用原生的PHP session相关方法,因为它们显得那样蹩脚
    if ($this->sessionConfigured()) {
        $session = $this->startSession($request);
        $request->setSession($session);
    }

    $response = $next($request);

    // 同样,如果session经过配置那么我们需要关闭session以便将session数据持久化到某些存储介质中
    // 我们还会添加session id到响应头cookie中
    if ($this->sessionConfigured()) {
        $this->storeCurrentUrl($request, $session);
        $this->collectGarbage($session);
        $this->addCookieToResponse($response, $session);
    }

    return $response;
}

此外,定义好中间件后,需要在app/Http/Kernel.php文件中注册该中间件,如果我们定义的中间件想要在全局有效,即每次请求都会调用,则将该中间件追加到$middleware属性数组;否则如果中间件只是在某些特定的路由中使用,则将其追加到$routeMiddleware属性数组,并在路由定义时使用middleware选项指定。

2.中间件参数

中间件还可以自定义额外的参数
比如实现年龄在18岁以上并且是男性才能访问某个页面的实现
AgeMiddleware.php

public function handle($request, Closure $next, $gender)
{
    if($request->input('age')>=18 && $gender==$request->input('gender')){
        return $next($request);
    }else{
        return redirect()->route('refuse');
    }
}

对应的路由配置

Route::group(['middleware'=>'age:male'],function(){
    Route::get('/write/test',function(){
        //使用Age中间件
    });
    Route::get('/update/test',function(){
        //使用Age中间件
    });
});

Route::get('/age/refuse',['as'=>'refuse',function(){
    return "18岁以上男子才能访问!";
}]);

这里会首先对提交的数据中'age'进行判断是不是大于'18',然后再对数据中的'gender'参数进行验证是不是'male'

标签: Laravel

添加新评论


手机号仅后台超管可见,普通注册用户以及网站前台全站不可见,请勿担心泄露风险!