CakePHP反向路由无法按预期工作

时间:2011-05-23 06:40:37

标签: cakephp url-routing cakephp-1.3

我的应用程序中需要多个路由以允许动态字符串继续前缀。

这是我的路线:

Router::connect('/:location/traveler/:controller/*', array('action' => 'index', 'traveler' => true, 'prefix' => 'traveler'), array('pass' => array('location')));

例如,如果我去 / south / traveler / requests ,它会成功路由到RequestsController :: traveler_index($ location ='south')。

这就是我想要的,但我还需要HtmlHelper :: link()来正确地将URL数组反向路由到该路由中。

这是我对HtmlHelper :: link()的调用:

$this->Html->link('List Requests', array('controller' => 'requests', 'action' => 'index', 'location' => 'south'));

前缀路由是(或应该)隐含的,因为这是从旅行者前缀中的视图调用的。

调用吐出的URL是:

http://domain.com/traveler/requests/location:south

我没有做正确的事吗?有什么方法可以避免创建自定义路由类来正确反向路由这些URL数组吗?

2 个答案:

答案 0 :(得分:3)

您需要使用location通知路由器Router::connectNamed应该是命名参数。请参阅Named Parameters section of the CakePHP v1.3 Book

URL: /contents/view/chapter:models/section:associations
     

制作自定义路线时,常见的缺陷是使用命名参数会破坏您的自定义路线。为了解决这个问题,您应该通知路由器哪些参数要命名为参数。在没有这方面的知识的情况下,路由器无法确定命名参数是否实际上是命名参数或路由参数,并且默认假设您希望它们是路由参数。要在路由器中连接命名参数,请使用Router :: connectNamed()。

Router::connectNamed(array('chapter', 'section'));
     

确保您的章节和章节参数正确反向路线。

答案 1 :(得分:2)

我解决了这个问题。

从routes.php中删除Router :: connectNamed(),我修复了错误配置的路由。

使用上面列出的路线,travel_index()的反向路由正常工作,但对任何其他函数的调用,如traveler_edit()都会失败。

使用下面的路线,我能够在旅行者前缀的任何控制器上以位置作为变量的任何操作的反向路线。

Router::connect('/:location/traveler/:controller/:action/*', array('traveler' => true, 'prefix' => 'traveler'), array('pass' => array('location')));

现在,我对HtmlHelper :: link()的调用正确地反向路由了我的URL数组:

$this->Html->link('Edit Details', array('controller' => 'requests', 'action' => 'edit', 'location' => 'south', 1234));

...反向 / south / traveler / requests / edit / 1234 的路线。