Laravel框架中引入了“中间件”这个概念,笔者觉得不是太合适。这里的Middleware和Java Servlet中的过滤器(Filter)就是一个东西,但是想比之下Filter这个词更容易理解一些。当然,为了入乡随俗,我们在这里也称这东西为“中间件”。
中间件的作用其实很简单,很明了:在业务行为之前先做点事情(前中间件)-->执行业务行为-->再做点其它事件(后中间件)。让我们来张灵魂画图:
所以,我们现在需要解决下面两个问题:创建和配置。
1、中间件的创建
在项目根目录下,执行php artisan make:middleware TestMidWare,就可以在/app/Http/Middleware下就自动生成了一个TestMidWare.php文件,里面有个TestMidWare类,原始代码如下:
2、中间件的使用
既然现在中间件类已经创建出来了,我们就开始讨论怎么让这个类生效。注册中间件,让中间件起作用,我们在这里讨论两种很常见的方式:全局中间件 和 路由中间件。
无论是哪一种中间件,都要在/app/Http/Kernel.php中注册,才可以生效。
(1) 全局中间件
Kernel.php文件中有一个名为$middleware的数组,只要将我们的中间件类(例上上面的TestMidWare)写在这个数组中,就会对所有的业务流程生效,如下图:
(2)路由中间件
在Kernel.php文件中有一个名为$routeMiddleware的数组,将中间件类写在这个数组中(要以key=>value的形式),并且在路由中指定,就可以生效,如下图:
接着,我们在路由中指定这个中间件:
这时当我们访问http://域名/hello/id的时候,在MyController@hello的业务生效前后,CrossDomain中间件就会起作用。
3、前/后中间件
无论是前中间件还是后中间件,本质都是中间件,创建和注册的方法都完全一样。只是代码在中间件类里的位置不一样而已。一个中间件可以同时是前中间件和后中间件。代码如下所示:
namespace AppHttpMiddleware; use Closure; class TestMidWare { /** * Handle an incoming request. * * @param IlluminateHttpRequest $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next) { //A 前中间件代码 $response=$next($request); //业务流程,流转到下一个中间件,或者业务处理函数 //B 后中间件代码 return $response; } }
代码写在A部分,这个中间件就是前中间件;代码写在B部分,这个中间件就是后中间件;如果A和B两个部分都写,那么这个中间件既是前中间件,也是后中间件。
4、其他
到了这里,中间件的使用方法就告一段落了。下面举个中间件使用的例子,我的代码需要实现跨域,所有的API响应之前都要输出跨域的header,所以我选用了中间件来处理:
<?php namespace AppHttpMiddleware; use Closure; class CrossDomain { /** * Handle an incoming request. * * @param IlluminateHttpRequest $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next) { $response=$next($request); $response->header('Access-Control-Allow-Origin', "*"); $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN'); $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated'); $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS'); $response->header('Access-Control-Allow-Credentials', 'true'); return $response; } }
中间件的话题到这里结束,上面是最最常用的中间件知识点。当然,中间件还有其他的话题:中间件组、终端中间件、中间件参数,这些大家就参考官方手册吧。
下回见咯:)
--------------------------- 我是可爱的分割线 ----------------------------
最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。