laravel中间件如何创建

  介绍

小编给大家分享一下laravel中间件如何创建,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!

<强>什么是laravel中间件

laravel中间件提供了一种机制在不修改逻辑代码的情况下,中断原本程序流程,通过中间件来处理一些事件,或者扩展一些功能,比如日志中间件可以方便的记录请求和响应日志,而不需要去更改逻辑代码。

那么我们简化一下软件执行过程,现在有一个核心类内核、下面是它的laravel代码

#捕获请求   $ request =,照亮\ Http \请求:捕获()   #处理请求   response 美元;=,内核→美元处理(请求)美元;

代码的作用是捕获一个请求,返回一个响应。这里面就是后续分发到具体执行逻辑的代码段并返回结果。

那么如果想在执行这个内核→美元处理()方法之前或者之后,增加一段逻辑一般会怎么写呢。大概如下:

request 美元;=,照亮\ Http \请求:捕获()   function  midware () {   之前,,,()#在之前执行的语句集合   ,,,# # # # #,,,,   ,,,response 美元;=,内核→美元处理($请求);   ,,# # # # #   后,,,()#在之后执行的语句集合   }

显然这样写没有问题,但是毫无拓展性可言,想执行什么东西都要更改这个方法,这种是不可能封装成框架核心内容的。怎么改进呢

定义一个要执行的中间件类叫中间件、类实现两个方法,在()和()后然后代码如下。

#配置项中有一项配置中间件:   时间=middleware  & # 39; & # 39;;   $ request =,照亮\ Http \请求:捕获()   function  midware () {   ,,,middleware.before ()   ,,,# # # # #,,,,   ,,,response 美元;=,内核→美元处理($请求);   ,,# # # # #   ,,,middleware.after ()   }

是否解决了问题呢,是解决了不用更改的问题,但是我们如果需要多个中间件怎么办呢,最容易想到的就是:定义一个中间件数组middleware_arr,每一个中间件类都含有之前和之后的方法,代码如下:

#配置项中有middleware_arr   middleware_arr=array ();   $ request =,照亮\ Http \请求:捕获()   function  midware () {   ,,,foreach (middleware_arr  as 中间件){   ,,,,,,middleware.before ()   ,,,}   ,,,# # # # #,,,,   ,,,response 美元;=,内核→美元处理($请求);   ,,# # # # #   ,,,foreach (middleware_arr  as 中间件){   ,,,,,,,middleware.after ()   ,,,}   }

虽然有点老土,但是的确解决了问题。但是这个还存在一个问题,就是我们怎么向中间件传递参数的问题,那么如下可以吗:

request 美元;=,照亮\ Http \请求:捕获()   function  midware () {   ,,,foreach (middleware_arr  as 中间件){   ,,,,,,middleware.before(请求)   ,,,}   ,,,# # # # #,,,,   ,,,response 美元;=,内核→美元处理($请求);   ,,# # # # #   ,,,foreach (middleware_arr  as 中间件){   ,,,,,,,middleware.after(响应)   ,,,}   }

看似是解决了问题,但是仔细分析,就会发现,这里面每次给中间件的都是最初的美元请求,这显然不行,修改成如下:

request 美元;=,照亮\ Http \请求:捕获()   function  midware () {   ,,,foreach (middleware_arr  as 中间件){   ,,,,,,request 美元;=,middleware.before(请求)   ,,,}   ,,,# # # # #,,,,   ,,,response 美元;=,内核→美元处理($请求);   ,,# # # # #   ,,,foreach (middleware_arr  as 中间件){   ,,,,,,,response 美元;=,middleware.after(响应)   ,,,}   }

还有一个问题就是,假设有两个中间件A和B,那么执行顺序应该是怎么样呢:

request 美元;=,照亮\ Http \请求:捕获()   $ request =, A.before($请求);   $ request =, B.before($请求);   美元$ response =,内核→处理($请求);   $ response =, A.after ();   response 美元;=,B.after ();

这样合理吗?不太好分辨,我们假设有一个记录请求和响应日志的中间件,这个时候,不论你把它放在什么位置,都不能完美的记录最初请求和最终日志。难道类似情况要写两个类,一个记录请求放在中间件数组第一个,一个处理响应,放在数组最后一位吗?不如在执行后面的foreach之前把middleware_arr数组给反转一下,这样就符合了要求:

laravel中间件如何创建