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的主要内容,如果未能解决你的问题,请参考以下文章