php开源一个MVC框架的诞生之中间件Middleware

Posted OpenFramework

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php开源一个MVC框架的诞生之中间件Middleware相关的知识,希望对你有一定的参考价值。


昨天发的太急没来得急加上使用方法,今天先补上 :


Application::input('in',function($value){
   //闭包实现
   //这里写具体的过滤方法
   //自定义
   //记得返回处理好的
   return $value;
});


首先第一个参数为接收的键名,第二个参数为闭包函数,自定义过滤方法在将处理好后的值进行返回即可,该闭包函数接收一个参数。即获取的键值




------------------------------------------------昨日完结--------------------------------------------



其实今天发布的中间件实现最终效果我也没有实现好,但是在研究Thinkphp5以及laravel代码的时候突然发现了个好玩的函数所以先发表下大致实现思路,明天发布具体的实现效果,通过上下两篇文章进行讲解。


namespace linkphp\boot\middleware;

use linkphp\boot\Exception;
use Closure;

class Middleware
{

   protected $beginMiddleware = [];

   protected $appMiddleware = [];

   protected $modelMiddleware = [];

   protected $controllerMiddleware = [];

   protected $actionMiddleware = [];

   protected $destructMiddleware = [];

   private $validateMiddle = [
       'beginMiddleware',
       'appMiddleware',
       'modelMiddleware',
       'controllerMiddleware',
       'actionMiddleware',
       'destructMiddleware'
   ];

   public function __construct()
   {
       $this->import(include LOAD_PATH . 'middleware' . EXT);
   }

   public function import($middle)
   {
       if(is_array($middle)){
           foreach($middle as $tag => $handle){
               if($this->isValidate($tag)){
                   $this->add($tag,$handle);
               } else {
                   throw new Exception('不是合法的中间件');
               }
           }
       }
   }

   public function add($tag,$handle)
   {
       switch($tag){
           case 'beginMiddleware':
               $this->beginMiddleware = $handle;
               break;
           case 'appMiddleware':
               $this->appMiddleware = $handle;
               break;
           case 'modelMiddleware':
               $this->modelMiddleware = $handle;
               break;
           case 'controllerMiddleware':
               $this->controllerMiddleware = $handle;
               break;
           case 'actionMiddleware':
               $this->actionMiddleware = $handle;
               break;
           case 'destructMiddleware':
               $this->destructMiddleware = $handle;
               break;
       }
   }

   private function isValidate($middle)
   {
       return in_array($middle,$this->validateMiddle);
   }

   public function begin()
   {
       call_user_func(array_reduce($this->beginMiddleware,$this->exec()));die;
   }

   public function app(){}

   public function model(){}

   public function controller(){}

   public function action(){}

   public function destruct(){}

   public function exec()
   {
       return function($v1,$v2){
           return function() use ($v1,$v2) {
               return (new $v2)->handle($v1);
           };
       };
   }

}


实例化中间类后将执行构造方法导入中间件配置文件:


return [

   'beginMiddleware'          => [
       \app\controller\main\Index::class,
   ],

   'appMiddleware'            => [],

   'modelMiddleware'          => [],

   'controllerMiddleware'     => [],

   'actionMiddleware'         => [],

   'destructMiddleware'       => [],

];


然后一次遍历对应键名保存至相应的属性中,框架在合适的位置进行相应的监听增加相应的处理方法,以框架初始化为例,触发begin方法,通过array_reduce方法一次迭代的将数组中的值传入exec()方法中,该方法返回两个闭包函数,在闭包中处理相关逻辑,而今天将着重讲解下array_reduce()方法:


官方文档说明:


(PHP 4 >= 4.0.5, PHP 5, PHP 7)

array_reduce用回调函数迭代地将数组简化为单一的值

说明

mixed array_reduce    ( array $array   , callable $callback   [, mixed $initial = NULL  ] )

array_reduce() 将回调函数   callback 迭代地作用到   array 数组中的每一个单元中,从而将数组简化为单一的值。


function myfunction($v1,$v2)
{
   echo $v1;
   echo $v2;
}


$a=array("Dog","Cat","Horse");
print_r(array_reduce($a,myfunction()));


打印结果 -Dog-Cat-Horse-


这是官方 的案例,而我们所用到的是将数组exec()方法而该方法返回的是闭包函数并传入两个值,第二个值为数组的键值,然后在闭包内处理其他的业务逻辑



------------------------------------------------------今日完结-----------------------------------


明天继续


以上是关于php开源一个MVC框架的诞生之中间件Middleware的主要内容,如果未能解决你的问题,请参考以下文章

php开源一个mvc框架的诞生之Application类input方法

原创Zend Framework 2框架之MVC

原创Zend Framework 2框架之MVC

ThinkPHP框架基础知识

为什么大部份开源项目不用MVC框架开发

在TP框架中,使用原生SQL有啥弊端