Laravel框架学习(中间件)

1、中间件简介

Laravel中可以把HTTP中间件看做“装饰器”,在请求到达最终动作之前对请求进行过滤和处理。中间件在Laravel中有着广泛的应用,比如用户认证、日志、维护模式、开启Session、从Session中获取错误信息,CSRF验证,等等。
中间件类默认存放在app/Http/Middleware目录下。

2、中间件使用
自定义中间件类只需要定义一个handle方法即可,然后我们将主要业务逻辑定义在该方法中,如果我们想在请求处理前执行业务逻辑,则在$next闭包执行前执行业务逻辑操作:

<?php

namespace App\Http\Middleware;

use Closure;

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

        return $next($request);
    }
}

如果想要在请求处理后执行中间件业务逻辑,则在$next闭包执行后执行操作:

<?php

namespace App\Http\Middleware;

use Closure;

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

        // 执行动作

        return $response;
    }
}

我们处理的大部分操作都是第一种场景,即在请求处理前执行操作,比如用户认证、CSRF验证、维护模式等都是这样,但也有用到第二种场景的时候,比如StartSession中间件,该中间件在请求处理前后都有操作,其handle方法如下:

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选项指定。

3、中间件参数
除了请求实例 request next之外,中间件还可以接收额外参数,我们还是以TestMiddleware为例,现在要求年龄在18岁以上的男性才能访问指定页面,handle方法定义如下:

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

4、定义可终止的中间件

可终止的中间件是指定义了terminate方法的中间件,terminate方法会在一次请求生命周期的末尾执行一些操作。比如StartSession中间件定义了该方法,在响应数据发送到浏览器之后将session数据保存起来。

可终止的中间件需要追加到app/Http/Kernel.php类的全局中间件列表即$middleware属性数组中。

调用中间件的terminate方法时,Laravel会从服务容器中取出新的中间件实例,所以如果想要调用handle方法和terminate方法时使用的是同一个中间件实例,需要使用singleton方法将该中间件注册到服务容器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值