我相信我知道如何做到这一点,但我想通过我真棒的社区来验证。 =)
以下是一个例子:
我有一个名为'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
中找到的默认路由。那是对的吗?或者会破坏其他东西?
答案 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',
));