所以我正在尝试安装并运行Kohana。我对它和框架很新(虽然我已经使用了CakePHP)。
无论如何......在我的bootstrap文件中我有这个:
// GET PARAMS -- This basically splits domain.com/kohana/controller/action/param1/etc
// into: controller | action | param1 | etc
$requestURI = explode('/', $_SERVER['REQUEST_URI']);
$scriptName = explode('/',$_SERVER['SCRIPT_NAME']);
for($i= 0;$i < sizeof($scriptName);$i++){
if ($requestURI[$i] == $scriptName[$i]){
unset($requestURI[$i]);
}
}
$param = array_values($requestURI);
$controller = @ $param[0];
$action = @ $param[1];
$param1 = @ $param[2];
$param2 = @ $param[3];
$param3 = @ $param[4];
$param4 = @ $param[5];
$param5 = @ $param[6];
$param6 = @ $param[7];
现在,我想连接到我的数据库,基本上看看第一个param又名$ param [0]又名$ controller是否等于我的一个页面“categories”(对应于我的categories_pages表)。如果它是一个类别,那么我想使用默认的“类别”控制器,否则,控制器应该是$ param [0]。这意味着,如果我访问domain.com/kohana/movies或domain.com/kohana/games,它将显示类别控制器,否则domain.com/kohana/users将显示用户控制器。
$db = Database::instance();
$getiscategory = DB::select('*')->from('categories_pages')->where('directory', '=', $controller)->execute();
$is_category = $getiscategory->count();
if($is_category){
$controller = "categories";
}
$controller = (empty($controller)) ? 'index' : $controller;
$action = (empty($action)) ? 'index' : $action;
我想在上面完成的工作。如果我回显$ is_category,我看到当存在类别匹配时返回值1,如果我回显$ controller,我看到“categories”被设置为控制器。
这是我的实际路由方法代码......
Route::set(
'custom',
'(<controller>(/<action>(/<param1>)(/<param2>(/<param3>(/<param4>(/<param5>(/<param6>)))))))'
)->defaults(array(
'controller' => $controller,
'action' => $action,
'param1' => $param1,
'param2' => $param2,
'param3' => $param3,
'param4' => $param4,
'param5' => $param5,
'param6' => $param6,
));
不幸的是,我不确定它的路由到哪里。正如我所提到的,$ controller先前作为正确的类别返回但是我收到错误消息“HTTP_Exception_404 [404]:在此服务器上找不到请求的URL $ param [0](电影或游戏等)。”< / p>
请记住,如果$ param [0]与类别匹配,我没有控制器类,因为我想使用“类别”控制器类。如果我去domain.com/kohana/categories它可以正常工作。
任何人有任何想法/知道解决方法吗?
添加#1
我发现即使调用了类别控制器并且调用了正确的操作,它仍然需要显示“显示”控制器。我添加了一个显示控制器,其中包含非常基本的信息(模板,内容等),并且显示正确。路由类中是否有解决方案使指定的控制器显示?就像我说的那样,我告诉它要去哪个控制器并且它承认它但它实际上并不是它。
答案 0 :(得分:1)
你想要的事情过于复杂。此外,您的代码会在每个请求中强制限制6个参数。
我可能更容易使用两种不同的路线,如果它与第一种路线不匹配,那么它可以回落到第二种路线。
Route::set(
'categories',
'(<category>(/<action>(/<param1>)(/<param2>(/<param3>(/<param4>(/<param5>(/<param6>)))))))',
array('category' => '(movies|games)')
)->defaults(array(
'controller' => 'category',
'action' => 'index',
));
Route::set(
'users',
'<username>(/<action>(/<param1>)(/<param2>(/<param3>(/<param4>(/<param5>(/<param6>))))))'
)->defaults(array(
'controller' => 'users',
'action' => 'index',
));
如果你只有一个或两个类别,你可以将它们构建到正则表达式字符串中,当然还有一些缓存。
否则,look up lambda routes,它们就是您拥有这样的动态路线的方式。