在cakepp(分支2.5)中,当尝试从数组构建url时,如果在Config/routes.php中找不到匹配的url,cakepp将补足一个。
也许一个例子会更有用:)
当我这样做时:
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.中的内容时,在断开链接时立即知道
在深入研究cakepp核心代码时,我发现了对这种行为负责的。它就在这里=>http://api.cakephp.org/2.5/source-class-Router.html#921-921
但既然我不想搞砸核心代码,我想知道是否有人知道如何正确地做到这一点?
谢谢!
只需从routes.php
中删除这一行。
require CAKE . 'Config' . DS . 'routes.php';
现在只有显式连接的路由才能工作。
按照Deimoks的建议,我查看了自定义Route类。首先,我认为它不能解决我的问题,因为在cakepp中,自定义路由类旨在定义如何将url解析为路由数组,或者如何将路由数组转换为url,对于给定的路由。然而,我的问题恰恰是当没有匹配的路由时,cakepp如何处理反向路由。
因此,我们的想法是在Config/routes.php的末尾创建一个新的路由,其目标只是捕获以前未解决的反向路由尝试。如果请求此路由进行反向路由,则意味着路由阵列出现问题,因为其他路由都找不到它的url。然后,此路由由一个自定义路由类处理,该类将记录反向路由失败。
在Config/routes.php:的末尾
App::uses('GarbageRoute', 'Routing/Route');
Router::connect('/', array(), array('routeClass' => 'GarbageRoute'));
In/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;
}
}
我仍然感到惊讶的是,cakepp不支持它,而且我必须创建自定义类才能获得这种行为。如果有人有更好的解决方案,请随时分享!