2013-04-22 84 views
1

我想確定我的路線以下默認行爲:如何在Phalcon的路由參數中定義默認鍵=>值對行爲?

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

此網址應該給調度以下PARAMS:

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

我知道它可以通過擴展路由器可以輕鬆完成並實施我自己的,但我想知道Phalcon是否有一個默認標誌,默認情況下切換該方法。

現在,如果我申請的路線

':模塊/:控制器/:動作/:PARAMS' 這個URL,我得到以下PARAMS:

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

這是我不想要。

如果Phalcon路由器沒有執行此操作的默認標誌,是否有一個事件在控制器中的DI調度程序中的參數可用之前立即觸發?我想在他們到達控制器之前至少手動將它們映射到key =>值對中。

編輯:我現在正在調查控制器中的beforeExecuteRoute事件,應該做我需要的。但是,如果路由器自動執行此操作,我仍然會喜歡它 - 有時參數不是固定順序,或者其中一些消失(認爲複雜的搜索查詢)。

+0

我沒有研究了這個,但在我寫的一個應用程序中,我只是使用X變量在Y位置的假設。即在你的例子中,我沒有使用/ q /,/ key /等,URL是:myaction/someTerm/someValue/AnotherValue等。讓我Ping @twistedxtra獲取更多的輸入。 – 2013-04-22 15:14:12

+0

是的,重要的是我可以混合和匹配變量 - 有時候其中一些將會丟失,其他時候,他們的位置將只是混合。我現在知道我可以用來完成這個事件,所以我正在更新我的原始問題,但我仍然希望路由器自己做這件事。 – Swader 2013-04-22 15:15:59

回答

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')); 
    } 
} 
+0

非常好,謝謝。我最初使它在基本控制器中的beforeExecuteRoute事件中工作,但是您的解決方案更好,因爲它將引導程序中的所有配置都保留下來。 – Swader 2013-04-22 15:28:05

相關問題