我想在我的路由上定义以下默认行为:
Url: myapp.com/mymodule/mycontroller/myaction/q/someTerm/key/someValue/key2/anotherValue
这个url应该给调度程序以下参数:
array(
'q' => 'someTerm',
'key' => 'someValue',
'key2' => 'anotherValue'
):
我知道通过扩展路由器和实现我自己的路由器可以很容易地做到这一点,但我想知道费尔康是否有一个默认标志,默认情况下开关这种方法。
现在,如果我应用路由
':module/:controller/:action/:params'到这个URL,我得到以下参数:
array(
0 => 'q',
1 => 'someTerm',
2 => 'key'
... etc
);
这是我不想要的。
如果Phalcon路由器没有一个默认标志来做这件事,是否有一个事件在参数在控制器中的DI的调度程序中可用之前立即触发?我希望至少在它们到达控制器之前,手动将它们映射为键=>值对。
编辑:我现在正在查看控制器中的beforeExecuteRoute事件,应该做我需要的。但我还是希望路由器能自动完成这一点——有时候参数不是固定的顺序,或者其中一些只是消失了(想想复杂的搜索查询)。
您可以在调度程序中拦截'beforeDispatchLoop'事件,以便在调度操作之前转换参数:
$di['dispatcher'] = function(){
$eventsManager = new PhalconEventsManager();
$eventsManager->attach('dispatch', function($event, $dispatcher) {
if ($event->getType() == 'beforeDispatchLoop') {
$keyParams = array();
$params = $dispatcher->getParams();
foreach ($params as $number => $value) {
if ($number & 1) {
$keyParams[$params[$number - 1]] = $value;
}
}
$dispatcher->setParams($keyParams);
}
});
$dispatcher = new PhalconMVcDispatcher();
$dispatcher->setEventsManager($eventsManager);
return $dispatcher;
});
在控制器中使用转换后的参数:
class IndexController extends ControllerBase
{
public function indexAction()
{
print_r($this->dispatcher->getParams());
print_r($this->dispatcher->getParam('key'));
}
}