Kohana:找不到请求的URL


Kohana: Requested URL was Not Found

所以我正在尝试安装并运行Kohana。我对它和一般框架都很陌生(尽管我用过一点CakePHP)。

无论如何。。。在我的引导文件中,我有这个:

// 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 aka$param[0]aka$controller是否等于我的一个页面"类别"(对应于我的categories_pages表)。如果它是一个类别,那么我想使用默认的"类别"控制器,否则,该控制器应该是$param[0]。这意味着,如果我转到domain.com/kohana/movies或domain.com/kohina/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](电影或游戏等)。"

请记住,如果$param[0]与类别匹配,则我没有控制器类,因为我想使用"类别"控制器类。如果我访问domain.com/kohana/categories,它可以正常工作。

有人有什么想法/知道周围的工作吗?

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

如果您只有一个或两个类别,您可以将它们构建到regex字符串中,当然还需要一些缓存。

否则,查找lambda路由,它们是可以获得这样的动态路由的方法。