(学习笔记)laravel 中间件
laravel的请求在进入逻辑处理之前会通过http中间件进行处理。
也就是说http请求的逻辑是这样的:
建立中间件
首先,通过Artisan命令建立一个中间件。
php artisan make:middleware [中间件名称]
例如我创建一个叫做 TestMiddleware的中间件。
php artisan make:middleware TestMiddleware
这样我们就会在app/http/middleware目录下看到我们在建立的中间件
注册中间件
中间件可以是针对route的也可以是针对所有http请求的。
在注册中间件时这两种有一定不同。
针对都有http请求
如果中间件在每一个HTTP请求期间都被执行,只需要将相应的中间件类设置到 app/Http/Kernel.php 的数组属性 $middleware 中即可。
如下:
protected $middleware = [
//这是自带的例子
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
//这是我注册的中间件
\App\Http\Middleware\TestMiddleware::class,
];
针对特定route
对于针对特定route的中间件。
app/Http/Kernel.php 类的 $routeMiddleware 属性包含了 Laravel 内置的入口中间件,在其中添加你自己的中间件只需要将其追加到后面并为其分配一个简写的key:
protected $routeMiddleware = [
//这是自带的例子
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
//这是我注册的中间件
'test' => \App\Http\Middleware\TestMiddleware::class,
];
在注册完中间件后就要开始绑定中间件到route。
绑定route有两种方法。
第一种是通过数组分配
Route::get('/', ['middleware' => ['first', 'second'], function () {
//
}]);
第二种是通过方法链来分配
Route::get('/', function () {
//
})->middleware(['first', 'second']);
同时,也可以在Controller中调用中间件,就是在Controller的构造方法中调用:
//Controller的构造方法
public function __construct()
{
//调用中间件
$this->middleware('test');
}
这样我们就能使用中间件了
中间件代码分析
中间件可以实现啊很多功能,例如权限验证,访问记录,重定向等等。
具体干什么看自己想法。
中间件在请求阶段会调用自己的handle()方法
同时中间件也可以在响应阶段使用,这时,会掉用它的terminate()方法。
所以,当需要在响应发出后使用中间件只需要重写terminate()方法即可。
<?php
namespace App\Http\Middleware;
use Closure;
class TestMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
//这里是响应后调用的方法
}
}
handle()方法
handle()方法有两个参数$request
--->请求信息,里面包含了输入,URL,上传文件等等信息。$next
--->闭包函数。我的理解是将接下来需要执行的逻辑装载到了其中。
返回值:
通过上文对参数的描述可以了解到:
当我们在中间件中return $next($request);
时,相当与把请求传入接下来的逻辑中。
同时,中间件也可以返回重定向,不运行之前的逻辑。
例如,希望将页面重定向到'/welcome'的页面return redirect('welcome')
.
注意,这里是重定向到"/welcome"这个地址的route而不是"welcome"这个页面(view)。
terminate()方法
参数$request
--->请求信息,里面包含了输入,URL,上传文件等等信息。$response
-->响应消息,包含了逻辑处理完成后传出到的响应消息。
因为terminate()方法只是在响应后进行一些处理所以没有返回值。