laravel的中间件

什么是中间件
中间件是一个轻量级、底层的插件系统,可以介入应用主题从请求到响应的处理过程。

​从网上扒的一张中间件的示意图

说明白点,中间件其实就是一个闭包,而且返回一个闭包。中间件为过滤进入应用的HTTP请求提供了一套便利的机制,常用于验证用户是否经过认证,添加响应头(跨域),记录请求日志等。

用到的一些概念​
1.闭包函数

也就是常说的匿名函数(什么是匿名?没有函数名不就是匿名了么...秀- -),允许临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。

​PHP中的匿名函数:PHP在5.3的版本之后支持了匿名函数,并统归属于Closure类下,通过Closure类来实现。那这就给我们在判断匿名函数时带来一定的好处了(稍后代码体现)。

2.函数式编程

关于这一块,推荐阮一峰老师的一篇博文 ---《函数式编程初探》

理解了这两个关键点之后​,我们就开始开搞啦~

简单的代码实现
思路

1.定义一个处理中间件的函数,负责不断返回​中间件的处理结果给下一个中间件

2.绑定的中间件函数,这里我用了一个简单的数组去实现这种绑定,目的在于第三部执行时,遍历这个数组​按添加顺序一个个执行

3.执行函数,负责总的请求数据输入,以及最终响应结果的返回,中间按绑定中间件的顺序不断的执行第一步中的函数

以上就是我为实现此次PHP中间件简单实现的一个思路,下面是代码实现。

demo类

调用
​把以上代码放在了一个名为demo.php的文件,执行一下,

总结​​
这篇文章只是讲了中间件最简单和基础的东西,PHP框架中,中间件做的比较突出的,非laravel莫属了,感兴趣的同学可以去扒他的 IlluminateRoutingRouter 源码研究一下。

<?php 
namespace TerryLin\Middleware;
use Closure;
/**
 * PHP中,中间件概念的简单实现
 *
 */
Class Demo 
{    
    //响应的数据
    public  $response;
    //绑定的中间件
    private $stack = [];
    /**
     * 执行中间件函数
     * @param mix $request  请求数据
     * @param mix $response 响应数据
     * @param Closure $next 把处理完的结果返回给下一个中间件
     * @return Closure
     */
    private function handle( $request, $response, Closure $next )
    {
        return $next($request,$response);
    }
    /**
     * 绑定中间件
     */
    public function bind(Closure $middleware)
    {
        $this->stack[]=$middleware;
        return true;
    }
    /**
     * 执行函数
     * @param mix $request  请求数据
     * @param mix $response 响应数据
     * @return mix
     */
    public function run($request,$response='')
    {
        $this->response = $response;
        foreach ($this->stack as $key => $value) 
        {
            $this->response = $this->handle($request,$this->response,$value);
        }
        return $this->response;
    }
}
$demo = new Demo();
$demo->bind(
    function($requset,$response){
        $response = $response.$requset.'filter By middleware!';
        return $response;
});
var_dump( $demo->run('someQueryParams') );

您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站大部分内容收集于互联网,如果有侵权内容、不妥之处,请联系删除。敬请谅解!

  关于博主【WANG-FEiHU】

Duplicate
-----------Complicate
--------------------------Appreciate
----------------------------------------[Fate]
-----------------------------------------------Elevate

三人行 有吾师

-------------花有重开日 梦无止境时-------------

  分类目录

  monitor(TD)

生命要得到丰盛的收获,必需阳光;同时,也需要“雨”的浇灌。

如真 如假 如可分身饰演自己 会将心中的温柔 献出给你唯有的知己

如痴 如醉 还盼你懂珍惜自己 有天即使分离我都想你 我 真的想你

红雨瓢泼泛起了回忆怎么潜

你的选择是做或不做,但不做就永远不会有机会。

爱是有多荒唐 ,恨也能醉人肠。

人生应该树立目标,否则你的精力会白白浪费。

种下一颗树最好的时间是十年前,其次是现在。

你我亦无他 唯手熟尔

只要锦绣山河在,物质名利还复来

https://www.bilibili.com/video/av35928275/?p=391

如若不是为了一个人,谁肯枯守一座城。城市和爱情,总是有着这样那样的关系。我们会因为一个人,去到那座城,因为那是一座爱的城;我们也会因为一个人,离开一座城,那是一座绝望的伤城。