1

我想在我的路线上定义以下默认行为:

Url: myapp.com/mymodule/mycontroller/myaction/q/someTerm/key/someValue/key2/anotherValue

此 url 应为调度程序提供以下参数:

array(
    'q' => 'someTerm',
    'key' => 'someValue',
    'key2' => 'anotherValue'
):

我知道可以通过扩展路由器并实现我自己的路由器来轻松完成,但我想知道 Phalcon 是否有一个默认标志可以默认打开该方法。

现在,如果我申请路线

':module/:controller/:action/:params' 到这个 URL,我得到以下参数:

array(
    0 => 'q',
    1 => 'someTerm',
    2 => 'key'
    ... etc
);

这是我不想要的。

如果 Phalcon 路由器没有执行此操作的默认标志,是否有一个事件在控制器中的 DI 调度程序中的参数可用之前立即触发?我想至少在它们到达控制器之前手动将它们映射到 key=>value 对。

编辑:我现在正在查看控制器中的 beforeExecuteRoute 事件,应该做我需要的。但是如果路由器自动执行此操作,我仍然会喜欢它 - 有时参数不是固定顺序,或者其中一些只是消失(想想复杂的搜索查询)。

4

1 回答 1

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'));
    }
}
于 2013-04-22T15:25:08.090 回答