Laravel 中间件:创建中间件 Draft
创建中间件
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
数组属性的尾部即可。
到此,我们完成了一个中间件的创建、注册过程。
推荐文章: