Laravel 中间件
中间件介绍
HTTP 中间件提供了一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Auth 中间件验证用户的身份,如果未通过身份验证中间件会把用户导向登录页面,反之,会继续走下去。
- CORS 中间件:负责替所有即将离开程序的响应加入适当的标头。
- 日志 中间件:负责记录所有传入应用程序的请求。
Laravel 框架已经内置了一些中间件,包括维护、身份验证、CSRF 保护等等,所有的中间件都存放在 app/http/Middleware
之中。
创建中间件
$ php artisan make:middleware modemiddleware
前置中间件/后置中间件
前置中间件
- 前置中间件 (BeforeMiddleware)
运行于请求处理之前:
public function handle($request, Closure $next)
{
// 例如:只允许 email 为905530550 登录
if ($request->input('email') == '905530550@qq.com'){
return redirect('home');
}
return $next($request);
}
译者注: 前置中间件运行的时间点是在每一个请求处理之前,可以参阅此文章加深理解:如何查看 Laravel 5 的所有数据库请求
后置中间件
- 后置中间件 (AfterMiddleware)
这个中间件会在应用程序处理请求 后 运行它的任务:
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// 运行动作
return $response;
}
}
译者注: 后置中间件运行的时间点是在请求处理之后,可以参阅此文章加深理解:如何查看 Laravel 5 的所有数据库请求
注册中间件
全局中间件
若是希望每个 HTTP 请求都经过一个中间件,只要将中间件的类加入到 app/Http/Kernel.php
的 $middleware
属性清单列表中。
为路由指派中间件
如果你要指派中间件给特定路由,你得先在 app/Http/Kernel.php
给中间件设置一个好记的 键,默认情况下,这个文件内的 $routeMiddleware
属性已包含了 Laravel 目前设置的中间件,你只需要在清单列表中加上一组自定义的键即可。
// 在 App\Http\Kernel 类内...
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];
中间件一旦在 HTTP kernel 文件内被定义,即可在路由选项内使用 middleware 键值指定:
Route::get('admin/profile', ['middleware' => 'auth', function () {
//
}]);
使用一组数组为路由指定多个中间件:
Route::get('/', ['middleware' => ['first', 'second'], function () {
//
}]);
除了使用数组之外,你也可以在路由的定义之后链式调用 middleware 方法:
Route::get('/', function () {
//
}])->middleware(['first', 'second']);
# 或者这样写
Route::post('login','SessionsController@store')->name('login')->middleware('test');
# 给IndexController 控制器里面的 index 的方法添加中间件
Route::get('/',['middleware'=>'auth','user'=>'IndexController@index'])
在分组里面使用中间件
Route::group(['namespace'=>'Admin','middleware'=>'auth','prefix'=>'admin'],function(){
Route::get('login','SesseionsController@create')->name('login');
});
中间件参数
中间件也可以接收自定义传参,例如,要在运行特定操作前检查已验证用户是否具备该操作的「角色」,可以创建 RoleMiddleware
来接收角色名称作为额外的传参。
附加的中间件参数将会在 $next
参数之后被传入中间件:
namespace App\Http\Middleware;
use Closure;
class RoleMiddleware
{
// 运行请求过滤
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// 如果用户没有特定「角色」的话
}
return $next($request);
}
}
在路由中可使用冒号 : 来区隔中间件名称与指派参数,多个参数可使用逗号作为分隔:
Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
//
}]);
本作品采用《CC 协议》,转载必须注明作者和本文链接