2012-01-25 108 views
2

所以我試圖安裝並運行Kohana。一般來說,我對它和框架都很陌生(儘管我已經使用了一些CakePHP)。Kohana:未找到請求的URL

反正...在我的引導文件我有這樣的:

// 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 [0]又名$控制器等於到我的一個頁面「類別」(對應我的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, 
)); 

不幸的是,我不知道它的路由來。正如我所提到的$控制器返回以前的類別是正確的,但我收到錯誤消息「HTTP_Exception_404 [404]:請求的URL $參數[0](電影或遊戲等)沒有在此服務器上找到。

請記住,如果它與某個類別匹配,我沒有$ param [0]的控制器類,因爲我想使用「categories」控制器類。如果我轉到domain.com/kohana/categories,它可以正常工作。

任何人有任何想法/知道解決方法?

加#1

我想通了,即使類別控制器被調用,正確的動作被調用,它仍然需要「顯示」控制器來顯示。我添加了一個帶有非常基本信息(模板,內容等)的演示控制器,並且顯示正確。在路由類中是否有解決方案來使指定控制器顯示?就像我說的那樣,我告訴它要去哪個控制器,它承認它,但實際上並沒有實現它。

+0

我很抱歉地說這個,但我認爲你完全不在你的引導中的代碼。你使用框架的原因不必這樣做。你可以在你的動作中用'$ this-> request-> param()'得到所有的路段(或參數)。 http://kohanaframework.org/3。2/guide/kohana/routing#request-parameters 對於您的路由實際問題,請閱讀文檔以及Lethargy的答案。您可以在URI中指定一條不含''的路由,並在defaults()中設置一個默認控制器。 –

回答

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,他們是你可以有這樣的動態路線的手段。

+0

請閱讀上面的#1。 – bowlerae

相關問題