5

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

/application/classes/Controller/Admin/Author.php
 - 管理员/作者
 - 管理员/作者/添加
 - 管理员/作者/编辑

/application/classes/Controller/Admin/Author/Book.php
 - 管理员/作者/书籍
 - 管理员/作者/书籍/添加
 - 管理员/作者/书籍/编辑

按指定顺序使用以下路由时,我只能访问admin/author{/action},但不能访问admin/author/book{/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',
    ));
4

3 回答 3

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(未经测试)。

另一种方法是使用路由过滤器

于 2012-11-16T06:59:09.147 回答
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',
   ));
于 2012-11-16T04:21:11.523 回答
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',
    ));
于 2012-11-16T10:48:51.327 回答