HTTP --- 中间件

简介:


HTTP 中间件:为过滤进入应用的HTTP请求提供一套便利的机制。
Laravel 框架自带了一些中间件,大部分在 app/http/Middleware 目录中

定义中间件:


php artisan make:middleware CheckAge

该命令会在 app/httpMiddleware 目录中创建一个 CheckAge 中间件类
用法参看手册

中间件 之前/之后

# 中间件前后 表示 程序片段执行的在请求控制器动作前 和 程序片段执行在请求控制器动作后 
# 参看手册代码 $next($request)
/* 请求之前的中间件 */
/* 请求之后的中间件 */

注册中间件:


注册中间件的位置:app/Http/Kernel.php
全局中间件:middleware

//> 这里注册的中间件 在所有的Http请求都会被执行【全局中间件】
protected $middleware  =  [];

路由组中间件

//> 这里注册的中间件,试用与路由组需要同时多个中间件时。如 web api
protected $middlewareGroups = [];

参看一下,api 中间件配置信息:


HTTP --- 中间件_第1张图片
throttle 和 bindings 都是中间件定义的key值,在上面routeMiddleware(路由中间件)中被定义。
throttle:60,1 中间件参数的形式。

中间件路由
这里分配的是单个路由

//> 这里分配的是单个路由中间件
protected $routeMiddleware = [];

中间件参数:

  • 中间件参数在路由或控制器中采用 'key:参数1,参数2,...' 形式
  • 中间件(使用)
# 中间件:处理路由到控制器之间的一个过滤机制
  • Start (开始)
# 我们需要创建一个中间件(当然是一个类啦)
php artisan make:middleware Blog  //> 使用该命令会生成一个Blog类
# 生成Blog中间件类的位置在app/Http/middleware目录下(命名空间App\Http\Middleware\Blog)
//> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
# 我们来看一下App\Http\Middleware\Blog类提供的唯一的一个handle方法
# handle()方法在注册执行时,会自动调用handle()方法
public function handle($request, Closure $next)
{
    //> $request 是Request请求的一个实例对象
    //> 下面这行代码则是传递http请求到控制器中
    return $next($request);
}
  • 注册中间件
# 注册中间件需要到 app/Http/Kernel.php类中
# 我们来看看一看Kernel.php中定义的几个属性
//> 该属性里面注册的中间件默认在整个Laravel中被加载
protected $middleware = [];
//> 路由群组需要使用多个中间件时,在这里注册(这里也是需要我们手动加载)
protected $middlewareGroups = [];
//> 这里注册单个中间件(当然需要我们手动加载)
prrotected $routeMiddleware = [];
  • 在路由中使用中间件
# 在普通路由中注册中间件
Route::get('photos',['middleware'=>'blog',function(){ //> 这里书写逻辑 }]);
Route::get('photos',['middleware'=>'blog','uses'=>'Admin\\PhotoController@index']);
Route::get('photos',function(){})->middleware('blog');
Route:;get('photos','Admin\\PhotoController@index')->middleware('blog');
# 这里笔者需要提醒一个注意:关于路由参数
# 路由的参数和url地址传递的参数在Laravel中是两回事(参看路由定义)
# 路由的参数:在闭包或控制器动作中已一一对应参数的形式被引用
# url中的参数:在请求中是以Request对象解析
  • 中间件参数
# 中间件参数:在中间件注册的使用传递一个或多个参数到中间件类里
# 中间件传递参数形式:middleware('blog:name,sex,age')
# 在注册中间件middleware中使用:(冒号)后跟参数(多个参数使用,(逗号分隔))
Route::group(['namespace'=>'Admin','prefix'=>'admin'],function ($route){
    //> 如下面的这种形式(多个参数使用,(逗号分隔))
    $route->get('p/{name?}','PhotoController@index')->name('p.index')->middleware('blog:name');
});
# 参数的接收在app/Http/middleware目录中中间件类中的handle方法中提示
# 比如上面的中间件里面 app\\Http\\Middlewarre\\Blog
public function handle($request, Closure $next, $name){
    //> 比如这里的name属性就是接收中间件参数的
    //> 代码逻辑书写
    return $next($request);
}
  • 可终止中间件
# 可终止中间件:在控制器执行完毕(包括视图渲染Http响应浏览器后执行)
# 在中间件里面 书写如下方法(terminate()该方法会自动调用)
public function terminate($request, $response){
    //> $request 请求实例对象 $response响应实例对象
    //> 浏览器响应后执行代码(这里)
}
# 注:这里也并没有手册上标注说明的需要注册到全局中间件的Kernel.php文件的middleware中
# 中间件 (分配控制器中给指定控制器动作)
public function __construct(){
  $this->middeware('log')->only('index');  //> 指定index动作
  $this->middleware('log')->except('store'); //> 排除 store 动作
}
//> __construct() 构造器中定义的中间件使用和Route路由中定义的之中间件有所不同
//> 支持参数 $this->middeware(string|array,options)
# 支持当前中间 string ; 支持多个中间件数组形式 array;
# options 数组形式形式如下 ['only'=>['xxx','xxx']] | ['except'=>['xxx','xxx']] 查看上面only和except用法

更多使用 - 参看 | laravel手册 - 中间件

你可能感兴趣的:(HTTP --- 中间件)