2012-01-25 20 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"(私のcategories_pagesテーブルに対応しています)に移動します。それがカテゴリであれば、デフォルトの "categories"コントローラを使用したいと思います。コントローラーは$ 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をエコーし​​た場合、「カテゴリ」がコントローラに設定されていることがわかります。

は、ここで私はそれがルーティングだ場所がわからないんだけど、残念ながら...

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

私は、カテゴリコントローラが呼び出されると、正しいアクションが呼ばれていても、まだ表示する「ショー」のコントローラを必要としていることを考え出しました。私は非常に基本的な情報(テンプレート、コンテンツ、等)とショーコントローラを追加し、それが正しく示した。指定されたコントローラを表示させるためのルーティングクラスの回避策はありますか?私が言ったように、私はそれに行くコントローラを教えて、それを認めますが、実際にはそれに行くことはありません。

+0

これは申し訳ありませんが、ブートストラップのコードは完全に無効であると思います。フレームワークを使用する理由は、このようなことをする必要はありません。あなたのアクションでは '$ this-> request-> param()'ですべてのルートセグメント(またはパラメータ)を得ることができます。 http://kohanaframework.org/3。2/guide/kohana/routing#request-parameters あなたの実際のルーティングに関する問題は、ドキュメントとLethargyの答えをもっと読んでください。あなたのURIに ''を含まないルートを指定し、 'defaults()'にデフォルトコントローラを設定することができます。 –

答えて

1

あなたは私が思うものを複雑にしています。また、あなたのコードは、すべての要求に対して6つのパラメータの制限を強制します。

2つの異なるルートを使用する方が簡単でしょう。最初のルートと一致しない場合は、2番目のルートに戻すことができます。

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

1つまたは2つのカテゴリしかない場合は、それらを正規表現の文字列に組み込むことができます。もちろん、キャッシングはいくつかあります。

そうでなければ、look up lambda routes、これはあなたがこのような動的ルートを持つことができる手段です。

+0

上記の追加#1をお読みください。 – bowlerae

関連する問題