Wallogit.com
2017 © Pedro Peláez
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)