我想在我的路线上定义以下默认行为:
Url: myapp.com/mymodule/mycontroller/myaction/q/someTerm/key/someValue/key2/anotherValue
此网址应向调度员提供以下参数:
array(
'q' => 'someTerm',
'key' => 'someValue',
'key2' => 'anotherValue'
):
我知道可以通过扩展路由器并实现我自己来轻松完成,但我想知道Phalcon是否有默认标志,默认情况下会切换该方法。
现在,如果我应用路线
':module /:controller /:action /:params'到这个URL,我得到以下参数:
array(
0 => 'q',
1 => 'someTerm',
2 => 'key'
... etc
);
这是我不想要的。
如果Phalcon路由器没有执行此操作的默认标志,是否有一个事件在控制器中DI的调度程序中的参数可用之前立即触发?我想在它们到达控制器之前至少手动将它们映射到key =>值对。
编辑:我现在正在调查控制器中的beforeExecuteRoute事件,应该做我需要的事情。但是如果路由器自动执行此操作,我仍然会喜欢它 - 有时params不是固定的顺序,或者其中一些只是消失(想想复杂的搜索查询)。
答案 0 :(得分:4)
您可以在调度程序中拦截'beforeDispatchLoop'事件,以在调度操作之前转换参数:
$di['dispatcher'] = function(){
$eventsManager = new Phalcon\Events\Manager();
$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 Phalcon\MVc\Dispatcher();
$dispatcher->setEventsManager($eventsManager);
return $dispatcher;
});
然后在控制器中使用转换后的参数:
class IndexController extends ControllerBase
{
public function indexAction()
{
print_r($this->dispatcher->getParams());
print_r($this->dispatcher->getParam('key'));
}
}