我的Kohana 3.2项目中有多个控制器,其中的路线最初是:
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'user',
'action' => 'index',
));
它适用于我所有的新控制器(当我添加一个新文件并转到:域/控制器时,它就像一个魅力。
现在,对于一个名为parents的特定控制器,我必须在我的bootstrap中添加新行:
Route::set('parents', '(<controller>(/<action>))')
->defaults(array(
'controller' => 'parents',
'action' => 'index',
));
Route::set('parent', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'parent',
'action' => 'index',
));
我试图同时访问: / parents / 和 / parent / index / id ,并且在没有Route::set
的情况下都生成错误
如果没有这些界限,我总会遇到如下错误:
无法找到匹配uri的路线
OR
请求的路线不存在
我该怎么办?对于我添加的每个控制器,我需要在我的引导程序中定义它吗?
答案 0 :(得分:1)
我最好使用一条路线:
Route::set('p', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'action' => 'index',
));
如果您致电/parents/father
- 您将转到parents
控制器,如果致电/parent/father
,则会转到parent
答案 1 :(得分:1)
实际上,在您的情况下,您只能使用默认路线。
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'user',
'action' => 'index',
));
首先,Kohana尝试匹配你的正则表达式模式[((/(/)))]。这将匹配网址:users,users / delete,users / delete / 1,parents,parents / view,parents / view / 2等。
如果Kohana无法找到该操作,它将默认根据您的默认数组规则进行索引。如果Kohana无法找到控制器(这实际上意味着没有通过),那么它将使用控制器。在最后一种情况下,它也会默认操作,因为我们无法在我们的正则表达式中传递控制器而无法传递操作(请参阅括号首先需要控制器然后操作然后执行id)。
因此,以下示例将路由此默认模式:
URL: /users
Controller: users
Action: index (picked default)
URL: /users/kill/1
Controller: users
Action: kill
Id: 1
URL: /parents
Controller: parents
Action: index (picked default)
URL: /parent/view
Controller: parent
Action: view
最佳做法是将此路线保留为应用的最后一条路线(基本上是默认路线并全部捕捉),如果您的网址与默认模式不匹配,请添加它们。