关闭Kohana 3中的默认路线?

时间:2011-03-22 18:52:20

标签: php routing kohana url-routing kohana-3

我相信我知道如何做到这一点,但我想通过我真棒的社区来验证。 =)

以下是一个例子:

我有一个名为'tami'的Controller类,带有一个动作'index'。

我知道如果我希望有人通过除“/ tami /”或“/ tami / index”以外的网址访问该控制器/动作组合,那么我应该添加一个路由,通过以下方式:

Route::set('pretty_tami', 'these-are-my-initials(/<action>)')
    ->defaults(array(
        'controller' => 'tami',
        'action' => 'index',
    ));

但是,用户仍然可以通过/tami/访问此页面。

如何关闭默认路由,以便唯一有效的路由是我定义的路由?

我假设我可以删除kohana/application/bootstrap.php中找到的默认路由。那是对的吗?或者会破坏其他东西?

3 个答案:

答案 0 :(得分:3)

我认为最简单的方法是删除引导程序文件中的默认路由,是的。但是,无法再访问未手动指定路径的任何控制器。

我要做的是创建一个类,例如Controller_Tami扩展的Controller_Derouter。使用Controller_Derouter中的before()方法测试是否从默认路由访问控制器,如果是,则抛出404.我认为您应该能够通过将$this->request->controller与第一个URI进行比较来做到这一点段。

编辑:如果您只计划禁用Tami控制器的默认路由,则上述解决方案是不必要的。如果是这种情况,您可以直接在Tami控制器中实现before()方法。

答案 1 :(得分:3)

我跟@simshaun完全一样 - 要么删除默认路由(让其他控制器无法访问),要么检查before()中的Controller_Tami函数以查看uri是否是你的'之后。

如果您正在使用Kohana 3.1,you can now use lambda logic/anonymous functions to define your routes

这样的事情会将额外的路由逻辑从控制器中取出(这很好,因为我们将它保存在一个地方):

Route::set('default', function($uri)
    {
        if ($uri == 'tami' OR $uri == 'tami/index')
        {
            // Route not allowed by the default methods
            throw new Kohana_404_Exception("Route not permitted");
        }
    },
    '(<controller>(/<action>(/<id>)))'
);

我尚未使用的东西,但它看起来非常强大。

答案 2 :(得分:1)

也许是这样的?

Route::set('pretty_tami', 'these-are-my-initials/<action>')
    ->defaults(array(
        'controller' => 'tami',
    ));

因此不存在默认action。您可能希望使用正则表达式更新default路由(如果您还有)以排除tami

Route::set('default', '(<controller>(/<action>(/<id>)))', array('controller' => '/^(?!tami)/'))
    ->defaults(array(
        'controller' => 'welcome',
        'action'     => 'index',
    ));