Cakephp反向路由:防止回退

时间:2014-11-07 22:57:03

标签: php cakephp cakephp-2.0 url-routing

在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

但是因为我不想弄乱核心代码,所以我想知道是否有人知道如何正确地做到这一点?

谢谢!

2 个答案:

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