lavavel 请求处理通道(中间件)

增加或减少功能需要重新组织相应过程,即实例化的顺序,因为这里实例化过程是手动实现的。手动,我们想到了什么,对,就是服务容器,在上一节已经讲了这个解决依赖注入的自动化设备,而Laravel框架就是通过服务容器进行自动实例化的,实例间的功能调用也是通过闭包函数完成的,这里为了将问题简单化,我们通过静态函数来避免实例化的过程,只仿真通过闭包函数完成装饰者模式,实现请求的处理管道。在Laravel框架中,针对请求的处理过程一共使用三次处理管道,下面我们先看一段管道代码

上面的输出内容是Laravel框架对请求处理的部分流程,这里面大部分与上一节中装饰者模式形式相似,但通过回调函数生成整个处理流程的过程还是比较难以理解。这里给一个简单的实例用于理解,代码如下:

这里我们将处理功能减少为一步,整个程序比较难理解的是array_reduce($steps,"goFun",$prepare)函数和goFun($step,$className)函数,其中array_reduce()函数在参数手册中介绍是用回调函数迭代地将数组内容进行处理,共有三个参数,前两个参数是必须赋值的,第一个是要处理的数组,第二个是处理函数名称或回调函数,第三个参数为可选参数,为初始化参数,将被当做数组中第一个值来处理,如果数组为空则作为返回值。这里我们给第三个参数传递一个回调函数,该函数用于将请求向路由器继续传递,返回响应,而第一个参数为一个数组,该数组记录了外层功能的类名,goFun()函数作为处理数组的回调函数。array_reduce()最终返回的是一个回调函数,即$go,代码如下:

$go = function()

{

return $FirstStep::go(function(){echo "请求向路由器传递,返回响应".'';});

};

在前面的例子中,通过call_user_func()函数执行这个回调函数,其实就相当于$go()。这里我们可以清晰地理解请求处理通道是如何设计出来的。

猜你喜欢

转载自blog.csdn.net/weixin_41380972/article/details/82790144