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

闻先后,术专攻
三人有师
习得文武艺,货与帝王家
人性不曾变,资本永无眠

-----------花有重开日,人无再少年-----------

  分类目录

  monitor(TD)

低头哭过别忘了抬头继续走。

不要被任何人打乱自的脚步,因为没有谁会像你一样清楚和在乎自己梦想。

你要记住你不是为别人而活,你是为自己而活。

我未曾跨过山河大海,也没穿过人山人海

停留在冬夜的冷风中,我不是也不想装脆弱,只因为你说过爱是等待,是细水长流