laravel笔记-中间件
写在前面
时间可贵,善用目录↑
学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。
什么是中间件(middleware)
HTTP 中间件为过滤进入应用的 HTTP 请求提供了一套便利的机制。
个人理解中间件相当于控制器的守门人。(控制进出的数据)
用户认证、日志、维护模式、开启Session、从Session中获取错误信息、CSRF验证
php artisan make:middleware CheckAge
中间件用法
如何定义?
中间件CheckAge控制只有age大于200的可以进入控制器
//中间件的命名空间
namespace App\Http\Middleware;
//匿名函数的类
use Closure;
class CheckAge
{
/**
* 返回请求过滤器
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->input('age') <= 200) {
//重定向
return redirect('home');
}
//进入控制器
return $next($request);
}
}
如何注册?
全局注册:
在app/Http/Kernel.php 的数组属性 $middleware 中添加~
分配到路由:
首先应该在 app/Http/Kernel.php 文件中分配给该中间件一个简写的 key ~
protected $routeMiddleware = [
......
'checkAge' => App\Http\Middleware\CheckAge::class,
];
然后:
Route::get('admin/profile', function () {
//
})->middleware('auth', 'checkAge');
//可以分配多个中间件,checkAge为我在Kernel.php中注册的CheckAge的key~
//或者这样:
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
//
})->middleware(CheckAge::class);
中间件组:
就是在Kernel.php中设置一个组将多个中间件包含在一起方便分配~
详见Kernel.php中的$middlewareGroups。(分配到路由的方法同中间件)
参数
CheckRole.php
namespace App\Http\Middleware;
use Closure;
class CheckRole
{
/**
* 运行请求过滤器
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string $role
* @return mixed
* translator http://laravelacademy.org
*/
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// Redirect...
}
return $next($request);
}
}
web.php
Route::put('post/{id}', function ($id) {
//
})->middleware('role:editor');
什么时候执行?
参照上面的例子:
//如果返回$next($request)表示请求处理之前
return $next($request);
//如果操作$next($request)表示请求处理之后
$next($request);
可终止的中间件
响应已经发送给浏览器后可终止中间件执行一些任务
不是很清楚是什么意思~
我理解的顺序是:
请求->路由(分配请求)->中间件handle->controller(响应请求)->中间件handle: next( request)->发送响应->terminate