在kohana路线严格空白应用uri

时间:2011-11-12 15:55:01

标签: php routing kohana


我正在尝试制定路线规则,以便向kohana的主页面发出请求。这是这样的:http://my_site/
并在这里陷入困境。在他们写的文档中,我可以制作这个或那个,很多变体,但我没有例子。简单地说我是否尝试这样做

Route::set('main/index', '')
    ->defaults(array(
        'controller' => 'main',
        'action'     => 'index',
    ));

然后如果我在页面http://my_site/hi上写Route :: get('main / index') - > uri(),我会得到一个指向同一页面的链接。如果我这样做的话

Route::set('main/index', null)
    ->defaults(array(
        'controller' => 'main',
        'action'     => 'index',
    ));

再没有结果,uri回调应该有一个有效值 在官方手册中,他们建议使用此变体

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

但是我需要一个严格匹配的规则,即http://my_site/,而不是http://my_site/(<controller>(/<action>(/<id>))) 有没有办法在没有重写Route类的情况下帮助我解决这个问题? 提前致谢

2 个答案:

答案 0 :(得分:2)

Route::set('main/index', '')
    ->defaults(array(
        'controller' => 'main',
        'action'     => 'index',
    ));

如果我确保在可能与空uri匹配的任何其他路线之前设置路线,则仅适用于我。将按照添加顺序检查路由是否匹配。

如果您想知道路由是否匹配(在开发服务器上),您可以将默认控制器设置为不存在的控制器,如'bogus'。然后Kohana将抛出一个Http_Exception_404,异常处理程序将为您提供一个错误页面。 (如果没有,则打开kohana错误。)在该页面上,单击堆栈跟踪的第一个跟踪的“arguments”链接。然后你应该看到如下内容:

object Request(18) {
    ...snip...
    protected _route => object Route(5) {
        protected _callback => NULL
        protected _uri => string(0) ""
        protected _regex => array(0) 
        protected _defaults => array(1) (
            "controller" => string(5) "bogus" // the non-existing bogus controller default
        )
        protected _route_regex => string(6) "#^$#uD"
    }
    ...snip...
}

我在添加任何其他路线之前放置了以下路线(也可能与uri相匹配):

Route::set('main/index', '')
    ->defaults(array(
        'controller' => 'bogus',
    ));

还要确保没有其他路由使用'main / index'名称,因为它会覆盖旧名称。实际上,我只是看了Route::uri()的代码并猜测了什么。静态路由(没有'&lt;'或'('在其中)的路由应返回当前url。由于空字符串是静态路由,因此该路由的结果Route :: uri将始终只是主机。这表明假设uri被设置为空字符串,则覆盖'main / index'路径。

当使用NULL作为路径的uri时,假设它来自缓存,当它不是来自缓存时,你最终会得到一条空路线。

答案 1 :(得分:1)

你的Route::get('main/index')->uri()返回一个相对的uri,在这种情况下是一个空字符串。您要执行的操作是使用url类的Route方法:Route::url('main/index')。这将为您提供经过Url::site的网址。