2012-03-05 76 views
0

我尝试这样做:Kohana 3路线::做第二条默认路线?

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

但其实我想要的“默认”(与渲染动作)来比default_controllers第一。

我希望它首先检查任何控制器,如果没有什么,那么它应该运行第二个默认的渲染。渲染检查数据库中的uri,如果存在则返回页面,否则会引发错误。

如果我切换两个路由位置,所以默认路由在'default_controllers'之前,那么它对cms页面可以正常工作,但与控制器无关(因为它不查找更多路由,渲染功能已抛出页面不存在的错误。)

我在这里做什么?我怎样才能让他们都工作?

回答

1

这里基本上有两条catchall路线。你应该删除其中的一个,并使你的路线更具体。 (<controller>(/<action>(/<id>)))路线实际上非常糟糕,仅作为示例提供。

0

为了使这个工作,你必须具体告诉路由哪些控制器加载。

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

如果你想,你可以写一个类去寻找控制器并缓存结果,以免增加加载时间。然后,您会将此值传递给数组中控制器键的值。

您的其他途径可以保持你怎么过的:

Route::set('default', '<uri>') 
->defaults(array(
    'controller' => 'cms', 
    'directory' => 'cms', 
    'action'  => 'render', 
));