Kohana 3.3控制器和目录名称相同的路由

时间:2012-11-16 03:56:07

标签: php routes uri kohana kohana-3.3

如何在Kohana 3.3中正确设置路线,其中我的控制器和目录的名称与下面的示例相同?

/application/classes/Controller/Admin/Author.php
 - admin/author
 - admin/author/add
 - admin/author/edit

/application/classes/Controller/Admin/Author/Book.php
 - admin/author/book
 - admin/author/book/add
 - admin/author/book/edit

按指定顺序使用以下路线时,我只能访问 admin / author {/ action} ,但 管理员/作者/书{/动作}

撤消路由订单可让我访问 admin / author / book {/ action} ,但不能 admin / author {/ action}

Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin',
        'controller' => 'Main',
        'action'     => 'index',
    ));

Route::set('admin/author', 'admin/author(/<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin/author',
        'controller' => 'Main',
        'action'     => 'index',
    ));

3 个答案:

答案 0 :(得分:3)

你需要这样的东西:

Route::set('admin-author', '<directory>/<controller>(/<action>(/<id>))', array(
        'directory' => '(admin|admin/author)',
        'action'    => '(add|edit|delete|index)'
    ))
    ->defaults(array(
        'directory'  => 'admin',
        'controller' => 'author',
    ));

此外,您可以尝试使用正则表达式^book检查操作(未经测试)。

另一种方法是使用Route filters

答案 1 :(得分:0)

您还需要为admin / author / book定义

Route::set('admin-author-book', 'admin/author(/<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin/author',
        'controller' => 'book',
        'action'     => 'index',
    ));
Route::set('admin-author-book', 'admin/author(/book(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin/author',
        'controller' => 'book',
        'action'     => 'index',
   ));

答案 2 :(得分:0)

关于路线最重要的事情:路线按照添加顺序进行匹配。撤消路线的顺序是正确的,但问题是您的路线admin/author也匹配admin/author{/action}。您可以做什么:强制执行控制器和操作:

// Does not match admin/author/add
Route::set('admin/author', 'admin/author/<controller>/<action>(/<id>)')
    ->defaults(array(
        'directory'  => 'admin/author',
    ));

Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin',
        'controller' => 'Main',
        'action'     => 'index',
    ));

有几种方法,另一种方法是创建控制器的“白名单”:

// Does not match admin/author/add
Route::set('admin/author', 'admin/author/<controller>(/<action>(/<id>))',
    array(
        'controller' => '(book|another-controller)'
    ))
    ->defaults(array(
        'directory'  => 'admin/author',
    ));

Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'directory'  => 'admin',
        'controller' => 'Main',
        'action'     => 'index',
    ));