CakePHP反向路由未按预期工作
我需要在我的应用程序中使用几个路由,以允许动态字符串继续使用前缀 这是我的路线:CakePHP反向路由未按预期工作,cakephp,url-routing,cakephp-1.3,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,它
Router::connect('/:location/traveler/:controller/*', array('action' => 'index', 'traveler' => true, 'prefix' => 'traveler'), array('pass' => array('location')));
例如,如果我转到/south/traveler/requests,它将成功路由到RequestsController::traveler\u索引($location='south')
这就是我想要的,但我还需要HtmlHelper::link()将URL数组正确地反向路由到该路由中
这是我对HtmlHelper::link()的调用:
前缀路由是(或应该是)隐含的,因为它是从旅行者前缀内的视图调用的
调用吐出的URL为:
http://domain.com/traveler/requests/location:south
我做得不对吗?是否有任何方法可以避免创建自定义路由类来正确反向路由这些URL数组?您需要使用
router::connectNamed
通知路由器location
应该是一个命名参数。见:
在创建自定义管线时,一个常见的陷阱是使用命名参数会破坏自定义管线。为了解决这个问题,您应该通知路由器哪些参数将被命名为参数。如果不了解这些信息,路由器将无法确定命名参数实际上是命名参数还是路由参数,并且默认情况下会假定它们是路由参数。要连接路由器中的命名参数,请使用router::connectNamed()
将确保您的章节和章节参数正确反转路线
您需要使用
router::connectNamed
通知路由器location
应该是一个命名参数。见:
在创建自定义管线时,一个常见的陷阱是使用命名参数会破坏自定义管线。为了解决这个问题,您应该通知路由器哪些参数将被命名为参数。如果不了解这些信息,路由器将无法确定命名参数实际上是命名参数还是路由参数,并且默认情况下会假定它们是路由参数。要连接路由器中的命名参数,请使用router::connectNamed()
将确保您的章节和章节参数正确反转路线
我解决了这个问题
从routes.php中删除Router::ConnectName(),我修复了配置错误的路由
到traveler_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我解决了这个问题
从routes.php中删除Router::ConnectName(),我修复了配置错误的路由
到traveler_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我将以下路由放在routes.php中:
Router::connectNamed(array('location'))
并且它仍然反向路由到http://domain.com/traveler/requests/location:south
现在,我一直在努力解决这个问题,我认为这个答案不太正确<代码>位置是一个路由参数。问题是,如果向URL添加命名参数,那么它也会将位置视为命名参数。因此,['controller'=>'请求','action'=>'编辑','location'=>'南','baggage'=>1234]
将中断并返回到/traveler/requests/edit/location:south/baggage:1234
。但是,当您拥有此URL时,您可以指定Router::connectNamed(array('baggage'))
,并且该数组可以正确反向路由。我将以下内容放在routes.php中的所有路由之上:Router::connectNamed(array('location'))
并且它仍然反向路由到http://domain.com/traveler/requests/location:south
现在,我已经经历了一些痛苦,试图弄明白这一点,我相信这个答案并不完全正确<代码>位置是一个路由参数。问题是,如果向URL添加命名参数,那么它也会将位置视为命名参数。因此,['controller'=>'请求','action'=>'编辑','location'=>'南','baggage'=>1234]
将中断并返回到/traveler/requests/edit/location:south/baggage:1234
。但是,当您有此URL时,您可以指定Router::connectNamed(array('baggage'))
,并且该数组可以正确反向路由。当我遇到此问题时/south/traveler/requests/edit/1234
将起作用,但是类似于/south/traveler/requests/edit/baggage:1234
的操作将失败,您将返回/traveler/requests/edit/location:south/baggage:1234
。解决这个问题的方法是处理命名参数的反向路由。当我遇到这个问题时,/south/traveler/requests/edit/1234
可以工作,但是类似于/south/traveler/requests/edit/baggage:1234
的东西将失败,您将返回到/traveler/requests/edit/location:south/baggage:1234
。解决方法是处理命名参数的反向路由。
$this->Html->link('Edit Details', array('controller' => 'requests', 'action' => 'edit', 'location' => 'south', 1234));