【问题标题】:Kohana 3.3 Routes where the name of a Controller and Directory are the sameKohana 3.3 控制器名称和目录名称相同的路由
【发布时间】:2012-11-04 19:09:23
【问题描述】:

如何在 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',
    ));

【问题讨论】:

  • 感谢所有花时间回答我问题的人!

标签: php routes uri kohana kohana-3.3


【解决方案1】:

你需要这样的东西:

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。

【讨论】:

    【解决方案2】:

    关于路由最重要的一点:路由按照添加的顺序匹配。颠倒您的路线顺序是正确的,但问题是您的路线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',
        ));
    

    【讨论】:

      【解决方案3】:

      您还需要为管理员/作者/书籍定义

      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',
         ));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        相关资源
        最近更新 更多