如何在Phalcon中定义路由参数上的默认键=>值对行为?

时间:2013-04-22 15:02:36

标签: php frameworks url-routing phalcon

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

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不是固定的顺序,或者其中一些只是消失(想想复杂的搜索查询)。

1 个答案:

答案 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'));
    }
}