Kohana 3.2:将控件路由到默认路径之外的另一个路径


Kohana 3.2: Route the control to another path than default

我试过以下方法

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

代替Home controller in Campaign文件夹我需要从Campaign/City文件夹加载Home controller默认情况下我在bootstrap.php中使用了上述代码,但它给'URL not found on this server'错误

传递给Route::set()的第三个参数数组限制了路由可以传递的值。在您的代码中,array('directory' => '(admin|affiliate)')将目录参数限制为'admin'或'affiliate',要使其更深入,您需要修改路由。

Kohana路由指南有很多使用过滤器的例子,你可以用任何你能想到的方式进行路由,但是你可以不使用过滤器就路由到子目录。

例如,目录结构如下:

classes/Controller/
  Admin/
    Cupertino/
      Home.php (Controller_Admin_Cupertino_Home)
    Home.php (Controller_Admin_Home)
  Affiliate/
    Cupertino/
      Home.php (Controller_Affiliate_Cupertino_Home)
    Home.php (Controller_Affiliate_Home)

和以下路线:

Route::set('sections', '<directory>(/<controller>(/<action>(/<id>)))',
    array(
        'directory' => '(admin/cupertino|admin|affiliate/cupertino|affiliate)'
    ))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

url index.php/admin, index.php/admin/cupertino, index.php/affiliateindex.php/affiliate/cupertino将通过各自的控制器路由。

子目录需要在父目录之前列出,否则Kohana将始终匹配父目录。例如,以下将始终路由到Controller_Admin_Home,即使URL index.php/admin/cupertino:

`array('directory' => 'admin|admin/cupertino')`.

使用过滤器可能像下面这样:

Route::set('admin_subsections', 'admin/<directory>(/<controller>(/<action>(/<id>)))',
    array(
        'directory' => '(cupertino|sanjose|santacruz)'
    ))
    ->filter(function($route, $params, $request)
    {
        // append "admin/" to the directory param
        $params['directory'] = 'admin/' . $params['directory'];
        return $params; // Returning an array will replace the parameters
    })
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));
Route::set('sections', '<directory>(/<controller>(/<action>(/<id>)))',
    array(
        'directory' => '(admin)'
    ))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

再说一遍,顺序很重要