Cakephp反向路由:防止回退


Cakephp reverse routing : prevent fallback

在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不支持它,而且我必须创建自定义类才能获得这种行为。如果有人有更好的解决方案,请随时分享!