在cakephp(分支2.5)中,当尝试从数组构建一个url时,如果在Config / routes.php中找不到匹配的那个,cakephp会组成一个。
也许一个例子会更有用:)
当我这样做时:
echo Router::url(array(
'controller' => 'some_non_existing_controller',
'action' => 'some_non_existing_action',
'fake_named_param' => 'blahblah'
));
我明白了:
/some_non_existing_controller/some_non_existing_action/fake_named_param:blahblah
我想得到的是一个例外告诉我"嘿,这条路线不存在"。这将有助于我调试我的工作,并在我在Config / routes.php中更改内容时断开链接时立即通知我。
当挖掘cakephp核心代码时,我发现了这个行为的责任。它位于这里=> http://api.cakephp.org/2.5/source-class-Router.html#921-921
但是因为我不想弄乱核心代码,所以我想知道是否有人知道如何正确地做到这一点?
谢谢!
答案 0 :(得分:0)
只需从routes.php
删除此行。
require CAKE . 'Config' . DS . 'routes.php';
现在只有明确连接的路线才有效。
答案 1 :(得分:0)
正如Deimoks建议的那样,我看了一下自定义的Route类。首先我不认为它可以解决我的问题,因为在cakephp自定义Route类旨在定义如何解析路由数组的URL或如何将路由数组转换为URL,为给定的路由。然而,我的问题正是在没有匹配路线时,cakephp如何处理反向路由。
因此,我们的想法是在Config / routes.php的末尾创建一个新的路径,其目标只是捕获之前未解决的反向路由尝试。如果请求此路由进行反向路由,则意味着路由数组出现问题,因为其他路由都没有找到它的URL。 然后,此路由由自定义路由类处理,该路由类将记录反向路由故障。
在Config / routes.php的最后:
App::uses('GarbageRoute', 'Routing/Route');
Router::connect('/', array(), array('routeClass' => 'GarbageRoute'));
在/ Routing/Route/GarbageRoute.php中:
<?php
class GarbageRoute extends CakeRoute {
public function match($url)
{
trigger_error(print_r($url, true) . 'does not match any url', E_USER_NOTICE);
return false;
}
}
我仍然感到惊讶,cakephp本身并不支持它,我必须创建自定义类才能获得此行为。如果有人有更好的解决方案,请随时分享!