Laravel 中间件:创建中间件 Draft 1 个改进

创建中间件

Laravel 的中间件提供了一种方便的机制过滤进入应用程序的 HTTP 请求。例如,Laravel 包含的身份验证中间件,验证应用程序的用户身份验证。如果用户未被认证,中间件会将用户重定向到登录界面。如果用户通过身份验证,中间件将允许请求进入下一步。

除了 Laravel 自带的一些中间件,我们也可以编写自己的中间件来执行各种任务。现在我们以创建一个检测请求是否来自微信浏览器的 CheckMicroMessenger 中间件为例,讲解如何创建一个中间件。

生成中间件类

首先,通过 Artisan 命令 make:middleware 来创建 CheckMicroMessenger 中间件类:

$ php artisan make:middleware CheckMicroMessenger

看到 Middleware created successfully. 创建成功的提示后, make:middleware 命令已为我们在 app\Http\Middleware 目录中生成了一个 CheckMicroMessenger.php 文件,源码如下:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckMicroMessenger
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

可以看到,生成的 CheckMicroMessenger 类包含一个 handle 方法,这个方法就是我们编写中间件逻辑代码的地方。

修改 handle 方法,添加以下代码:

public function handle($request, Closure $next)
{
    $agent = $request->header('user-agent');

    if (preg_match('#MicroMessenger#i', $agent)) {
        return redirect('wechat');
    }

    return $next($request);
}

这段代码的作用就是检测发起请求的客户端的代理字符串,如果包含 MicroMessenger,则判定是微信浏览器,重定向请求至我们的微信公众号关注页面。如果不是,则返回 $next($request) 将请求传递下去。

前置 & 后置中间件

中间件可以在处理请求之前或者之后执行,这取决于中间件的功能。前置中间件用于在处理请求 之前 执行某些任务,下面是前置中间件 handle 方法的代码结构:

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // 前置操作代码在这里

        return $next($request);
    }
}

可以看到,我们上面创建的 CheckMicroMessenger 就是一个前置中间件,

有前就有后,后置中间件用于在处理请求 之后 执行某些任务,下面是后置中间件的一般结构,

<?php

namespace App\Http\Middleware;

use Closure;

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

        // 后置操作代码在这里

        return $response;
    }
}

注册中间件

中间件建好之后,我们还需要对其进行注册,才能使其起作用。因为我们希望 CheckMicroMessenger 在处理每个 HTTP 请求期间运行,所以需把其注册为全局中间件,这需要修改 app/Http/Kernel.php 文件:

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,

        \App\Http\Middleware\CheckMicroMessenger::class,
    ];

    // 省略...
}

可以看到,这个文件已经注册了很多 Laravel 自带的中间件,我们只需添加 \App\Http\Middleware\CheckMicroMessenger::class,$middleware 数组属性的尾部即可。

到此,我们完成了一个中间件的创建、注册过程。

参考

本 Wiki 尚未完善,邀您参与 如何撰写一篇高品质的 Wiki?
讨论数量: 2
elesos

Nice work

4年前 评论

php artisan make:middleware CheckMicroMessenger 为什么没用用

file

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!