zoukankan      html  css  js  c++  java
  • ThinkPHP5.1x 中间件实现原理

    ThinkPHP5.1x的中间件,其核心还是闭包函数的应用,来实现“责任链”模式:

    模拟代码:

    复制代码
    <?php
    
    //模拟的控制器
    class Controller {
        public function index($request) {
            echo '控制器方法体',$request,'<br>';
        }
    }
    
    //中间件
    class Before1 {
        public function handle($request, Closure $next) {
            echo 'before1<br>';  //业务逻辑,注意前置与后置中间件业务逻辑代码的位置
            return $next($request);
        }
    
    }
    //中间件
    class Before2 {
        public function handle($request, Closure $next) {
            echo 'before2<br>';
            return $next($request);
        }
    }
    //中间件
    class After1 {
        public function handle($request, Closure $next) {
            $response = $next($request);
            echo 'after1<br>'; //业务逻辑,注意前置与后置中间件业务逻辑代码的位置
            return $response;
        }
    }
    //中间件
    class After2 {
        public function handle($request, Closure $next) {
            $response = $next($request);
            echo 'after2<br>';
            return $response;
        }
    }
    
    class Middleware {
    
        public static $queue;  //中间件队列
        public static function init() {        
            //模拟的中间件,数量任意添加
            self::$queue[] = [[After1::class,  'handle'], null];
            self::$queue[] = [[After2::class,  'handle'], null];
            self::$queue[] = [[Before1::class, 'handle'], null];
            self::$queue[] = [[Before2::class, 'handle'], null];
             //模拟的控制器
            self::$queue[] = [[Controller::class,  'index'], null];
        }
        
        //调用中间件
        public static function dispatch($request) {
            call_user_func(self::resolve(), $request);
        }
        
        //返回闭包函数
        public static function resolve(){
            return function($request){
                $middleware = array_shift(self::$queue);
                if ($middleware != null) {
                    list($call, $param) = $middleware;
                    call_user_func_array($call, [$request, self::resolve()]);  //执行中间件
                }
            };
        }
    }
    
    $request = "模拟的request对象";
    Middleware::init();
    Middleware::dispatch($request);
  • 相关阅读:
    url中特殊字符被转义成编码后处理
    使用axios解决$.ajax不能下载文件问题
    ES6学习-封装一个分页插件
    input输入框延时防抖
    ES6学习-封装tab选项卡
    JS的forEach()map()遍历和jQuery的$.each()$.map()遍历
    JavaScript正则表达式实现批量替换实际案例
    点击页面出现爱心效果
    vue父子组件传值
    Vue——实现简易计算器
  • 原文地址:https://www.cnblogs.com/liliuguang/p/10856681.html
Copyright © 2011-2022 走看看