a phalcon middleware component
a phalcon middleware component, (*1)
composer require myph/phalcon-middleware
, (*2)
在service.php中添加, (*3)
$di->setShared('middlewareManager',function(){ $middlewareManager = new \Myph\Middleware\Manager(); //注册中间件 $middlewareManager->add('middlewareAlias','middlewareHandle'); // ... return $middleware }); //替换默认的dispatcher $di->setShared('dispatcher',\Myph\Dispatcher::class);
创建中间件, (*4)
中间件必须继承Myph\Middleware
这个类,并实现handle($request,\Closure $next)
方法, (*5)
example: ```php <?php, (*6)
namespace App\Middleware;, (*7)
use Myph\Middleware;, (*8)
class Aaa extends Middleware { public function handle($request ,\Closure $next) { //在中间件中使用service if($this->request->isAjax()){ return $this->response->redirect('/login'); } //前置操作 echo METHOD.', (*9)
'; $response = $next($request); //后置操作 echo METHOD.', (*10)
';, (*11)
return $response; }
}
* 注册中间件
php
$middlewareManager->add('middlewareAlias1',App\Middleware\Aaa::class);
$middlewareManager->add('middlewareAlias2','middlewareHandle2');
$middlewareManager->add('middlewareAlias3','middlewareHandle3');
```
* 分配中间件
* 全局中间件, (*12)
若希望每个请求都会经过的中间件,可以添加全局中间件, (*13)
添加全局中间件只需在middlewareManger服务中使用set
方法, (*14)
example:
$middlewareManager->set('aaa');
//or
$middlewareManger->set(['bbb','ccc']);
* 在控制器中分配, (*15)
在控制器的initialize()
方法中调用middlewareManger服务, (*16)
example:
php
public function initialize()
{
$this->middleware->set(
['csrf','auth'],
[
//这里可以使用only和except,对应的参数是方法名
'except'=>['login','register']
]
);
}
* 使用Annotations
使用annotations可以直接在控制器类或者方法的注释中分配中间件
example:
```php
<?php, (*17)
namespace App\Controllers; /** * @Middleware('bbb'); */ class IndexController extends ControllerBase { /** * @Middleware('aaa','csrf','auth') */ public function index() { echo __METHOD__.'<hr>'; } }
```
禁用annotationsMiddleware,可以在middlewareManager中使用$middlewareManger->useAnnotations(false);
来禁用annotation, (*18)
管理中间件可以单独使用一个文件来管理, (*19)
example:
php
$di->setShared('middlewareManager',function(){
$middlewareManager = new \Myph\Middleware\Manger();
require $this->get('config')->application->configDir.'middleware.php';
return $middlewareManager;
});
为什么要重写dispatcher?, (*20)
这里实现Phalcon的middleware是使用Myph\Dispatcher继承Phalcon\Mvc\Dispatcher重写了里面的_dispatch方法的,这个Myph\Dispatcher依赖于middlewareManager服务., (*21)
Phalcon原本的Phalcon\Mvc\Dispather是里面的Hooks是先是beforeExecuteRoute,后是调用控制器的initalize方法,执行handle后fire afterExecuteRoute的,这里如果不重写dispatcher的话,就不能实现initalize中分配中间件,只能使用annotations,而且,需要把Middleware中前置后置操作分开写., (*22)