前言:Laravel文档梳理,仅作为记录后看,无关其他。
1、什么是中间件?
见字识意,放在中间部分,用来处理某种业务的组件。http中间件,提供了一个方便的机制过滤进入应用程序的http请求,只有经过了中间件的过滤,程序才会继续往下运行。
2、常见的中间件功能
Auth中间件,验证用户的身份
Cors中间件,负责替所有即将离开程序的响应,加入适当的标头
日志中间件,负责记录所有传入应用程序的请求。
3、laravel框架的中间件放在哪里?
App/Http/Middleware
4、如何创建出一个中间件?
php artisan make:middleware OldMiddleware
Ps:可手动创建,也可以通过artisan命令来生成。
此命令将会在 app/Http/Middleware 目录内设定一个名称为 OldMiddleware 的类
5、OldMiddleware中间件实例
<?php
namespace App\Http\Middleware;
use Closure;
class OldMiddleware
{
/**
* 运行请求过滤器。
*
* @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);
}
}
Age小于200,中间件将返回http请求重定位到用户端,否则,进步传入应用程序。
6、如果你希望http请求,都经过你的中间件,那该怎么处理?
将中间件加入到app/Http/kernel.php文件的$middleware属性中。
7、如果你想单独给某个路由指定中间件,如何处理?
a、在app/Http/Kernel.php文件的$routeMiddleware属性中加一组自定义的该中间件的键值,如下:
// 在 App\Http\Kernel 类内...
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];
b、在路由文件中,针对路由使用添加好的中间件的键名,即可。
中间件,一旦在kernel文件中指定,就可以在路由选项中,使用middleware键值指定:
Route::get('admin/profile', ['middleware' => 'auth', function () {
//
}]);
c、也可以给一个路由使用多个中间件,如下:
Route::get('/', ['middleware' => ['first', 'second'], function () {
//
}]);
d、除了c这种方法,也可以链式调用middleware方法
Route::get('/', function () {
//
}])->middleware(['first', 'second']);
8、中间件参数
运行某操作前,要验证当前用户是否有该【角色】,你可以创建一个角色中间件,接收角色名称,作为额外传参:
<?php
namespace App\Http\Middleware;
use Closure;
class RoleMiddleware
{
/**
* 运行请求过滤
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string $role
* @return mixed
*/
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// 如果用户没有特定「角色」的话
}
return $next($request);
}
}
在路由中,可使用冒号:来间隔中间件名称与指派参数,多个参数可以使用逗号分隔
Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
//
}]);
9、Terminable中间件
这个中间件,是为了满足http请求发送到浏览器之后,才处理session存储操作的。
<?php
namespace Illuminate\Session\Middleware;
use Closure;
class StartSession
{
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
// 保存 session 数据...
}
}
一旦定义了中间件,你就需要把它加到kernel文件的全局中间件清单列表中。
当你调用terminate()方法时,laravel会从服务器容器解析出一个全新的中间件实例。
如果你希望handle() terminate()方法被调用时使用一致的中间件,那么,就需要使用容器的singleton方法注册中间件。