2015-12-09 75 views
0

我的應用程序(這是一個API)的路由遇到了一些非常奇怪的事情。我不使用微型,只是使用普通的Phalcon堆棧。模塊路由不對

這裏是我的路由器定義:

$di->set('router', function() { 
    $router = new Router(false); 

    $router->setDefaultAction('index'); 
    $router->setDefaultController('index'); 

    $router->add('/:module/:controller/:params', array(
     'module' => 1, 
     'controller' => 2, 
     'params' => 3 
    )); 

    $router->removeExtraSlashes(true); 

    return $router; 
}); 

的路由器工作與這些示例路徑:

  • /V1 /用戶/
  • /V1 /用戶/ 1/
  • /V1/users/1/permissions/

但是對於某些r艾森以下任何路線都不匹配!

  • /V1/

奇怪的是,我是用路由定義打過來,然後,當我改變添加的第一個參數只是「/:模塊」(而不是「/:模塊/:controller /:params'),路由器按預期工作!

我在我的智慧結束,希望有人能幫助我。我不知道我做錯了什麼。不知道爲什麼一個路由定義會起作用,而另一個會失敗。我錯過了什麼嗎?

注:

  • 我沒有setDefaultModule,因爲我想要的應用程序模塊丟失時拋出一個錯誤。我計劃對應用進行版本控制,並且我想通過這種方式我可以正確處理丟失的模塊。我無法找到更好的答案來處理這個問題,所以我盡我所能。
  • 我使用完整的Phalcon應用程序,而不是微,因爲我想訪問整個框架。只是一個架構決定。

回答

1

與你也可以只通過模塊名訪問添加路由模塊現有的路線沿:作爲

... 
$router->add('/:module/:controller', 
    array(
     'module' => 1, 
     'controller' => 2, 
     'action' => 'index', 
    ) 
); 
$router->add('/:module', 
    array(
     'module' => 1, 
     'controller' => 'index', 
     'action' => 'index', 
    ) 
); 
... 
+0

我想避免這種路由。如果最初的路線應該涵蓋所有三個用例(除非我誤解了Phalcon的路線,我希望不是這種情況),我沒有看到有三條路線。我的意思是,最終,如果沒有更好的方法來解決這個問題,那麼我將不得不這樣做。我想知道我的問題的根源是什麼。 但是,我真的很感謝這個建議。謝謝! –

+0

@SebastianFrohm我明白你的感受,但這是它的工作方式,一旦你有很多路線,這是一件好事。你也可以找到* setPrefix *方法。 – galki

0

如果你想更新版本的模塊,並有一定的順序,這是一種方式。

$router = new Router(false); 
$versionedModules = ['a', 'b', 'c']; 

foreach ($versionedModules as $module) { 
    $namespace = 'App\\'. ucfirst($module) . '\Controllers'; 
    $moduleRouter = new \Phalcon\Mvc\Router\Group([ 
     'namespace' => $namespace, 
     'module' => $module 
    ]); 

    $moduleRouter->add("/{$module}/:controller/:params/", [ 
     'controller' => 1, 
     'params' => 2 
    ]); 
} 

$router->mount($moduleRouter);