2011-11-14 6 views
1

私はkohana 3.2アプリケーションの/ application/classes/controller /に "バックエンド"フォルダを作成しました。kohana 3:バックエンド部分のルートを作成するにはどうすればよいですか?

だから私は次のようにフォルダ構造を持っている:私のbootstrap.phpの内のルート

/application 
+/classes 
++/controller/ 
+++/A_controller.php 
+++/Another_controller.php 
+++/backend/ 
++++/A_Backend_controller.php 

Route::set('default', '(<controller>(/<action>(/<id>)))') 
    ->defaults(array(
     'controller' => 'home', 
     'action'  => 'index', 
    )); 

Route::set('backend', '<directory>(/<controller>(/<action>(/<id>)))') 
->defaults(array(
     'directory' => 'backend', 
     'controller' => 'home', 
     'action'  => 'index', 
    )); 

私は私のURLを書き換え、.htaccessファイルを持っており、「index.phpのを削除"URLのように、私は通常次のようなページを呼び出します: www.mysite.com/controller_name/action_name

私がルート文書で"バックエンド "ro私が書いた、これはうまくいくはずです: www.mysite.com/backend/controller_name/action_name

しかし、それはどういう意味ですか?

答えて

2

問題は、あなたのルートで<directory>を持っています。 Kohanaがルートを読み込もうとすると、ディレクトリの値が変更されます。バックエンドのルートは次のようになります。

Route::set('backend', 'backend(/<controller>(/<action>(/<id>)))') 
    ->defaults(array(
     'directory' => 'backend', 
     'controller' => 'home', 
     'action'  => 'index', 
    )); 

注:このルートは、デフォルトのキャッチオールルートの前に来る必要があります。さもなければKohanaは決してあなたのルートに行きません。

+0

いいえ、私もこれを試して何も解決しませんでした。ルート:: setのはdefaults配列の 'directory'の値に置き換えられます... – Piero

+1

@Piero私はKohanaのクラス命名構造から逸脱しているため、Kohanaのルーティングが失敗するでしょう。ルートの例、マップするクラス、クラスの位置を挙げることができます。 – Wade

0

これは私が自分のアプリケーションの一つ、それがうまくいく方法

Route::set('default', 'admin/<controller>(/<action>(/<id>))') 
    ->defaults(array(
      'directory' => 'admin', 
      'action'  => 'index', 
    )); 

Route::set('user', '(<controller>(/<action>(/<id>)))') 
    ->defaults(array(
      'controller' => 'user', 
      'action'  => 'index', 
    )); 

に使用しています何かありますか?

  • Kohanaによれば、最初にリストされたルートが最も優先されます。
  • それはどのルートのいずれかの一致を見つけることができない場合、それはdefaultルート

にフォールバックまず最初は、私たちがディレクトリ構造で作業をしたいならば、我々は最初に記載されたディレクトリベースのルートを配置する必要があり、です。あなたが見てみると、userルートを最初に指定すると仮定すると、それはhttp://example.com/directory/controller/actionのような任意のURLパターンに対して選択されます。

このようなシナリオを回避するには、directory basedルートの後で、そのようなルートをリストする必要があります。はい、それは変です。しかし、これはコナナのために働く方法です。私はKohanaがこの動作を改善したいと思う。

更新Lambda/Callback route logicでデバッグを試してください。それはすべてを説明するかもしれない。

Route::set('testing', function($uri) 
{ 
    if ($uri == 'foo/bar') // check the prefix for "backend" 
     return array(
      'controller' => 'welcome', 
      'action'  => 'foobar', 
     ); 
    }, 
    'foo/bar' 
); 
+0

実際に私はすでにこれを試み、それが動作しませんでした...私はそれを上下に移動しました名前を変更してconfを変更しましたが、何もしませんでした。私はそれがhtaccess関連の問題だと思っています...しかしそれでも解決できません...とにかく助けてくれてありがとう! :) – Piero

+1

ルートが一致しない場合、Http_Eception_404がスローされます。 'default'という名前のルートは特別なものはありません。あなたがinstall.phpを削除した後に、例として、そして「こんにちは世界」の応答を与えることがあります。 – Darsstar

+0

試しましたか? http://kohanaframework.org/3.2/guide/kohana/routing#lambdacallback-route-logic – Kowser

1

あなたは2つのルートを定義し、任意のセグメントに対して正規表現を「オーバーロード」しません。セグメントのデフォルトの正規表現は[^/.,;?\n]++です。したがって、すべてのセグメントはその正規表現に一致する必要があります。

あなたの最初のルートは、Kohanaをそのままの状態で提供するルートです。スラッシュで区切られた0,1,2,3のセグメントに一致します。 2番目のルートは、1、2、3、4セグメントに一致します。

「default」という名前のルートは、このuri:user/purcheses/view/42のように3つ以上のセグメントに一致しない場合があります。ルート 'default'がuriと一致しなかった場合、次のルートがチェックされます。あなたの場合、ルートは「バックエンド」と名づけられました。

2つのルートの順序を入れ替えると、ルート 'バックエンド'が最初になり、0以上4セグメントでのみ失敗します。 0セグメントの場合、ルート 'default'はそれに一致し、5つ以上のセグメントではHttp_Exception_404がスローされます。 しかし、最初に 'バックエンド'を配置すると、多くのページを破損する可能性が高いサブディレクトリのコントローラにのみルーティングされます。

<directory>をハードコードされた値で置き換えたり、その正規表現を追加したり、ラムダ/コールバックルートを作成したりすることができます。

ために:

Route::set('backend', 'backend(/<controller>(/<action>(/<id>)))') 
->defaults(array(
     'directory' => 'backend', 
     'controller' => 'home', 
     'action'  => 'index', 
    )); 

Route::set('backend', '<directory>(/<controller>(/<action>(/<id>)))', array('foo|bar|backend')) 
->defaults(array(
     'directory' => 'backend', 
     'controller' => 'home', 
     'action'  => 'index', 
    )); 

// not tested 
Route::set('nested', function($uri, $directory = '') 
{ 
    if (! $segments = explode('/', $uri)) 
     return; 

    // get a multidimensional array of the Cascading File System with classes/controller as the root 
    $list = Kohana::list_files('classes/controller'); 

    foreach($segments AS $segment) 
    { 
     if (! isset($list['classes/controller/'.$directory.$segment])) 
      break; 

     // we found a new existing directory, append it 
     $directory .= array_shift($segments).DIRECTORY_SEPARATOR; 

     // reduce $list to the remaining possible paths 
     $list = $list[rtrim('classes/controller/'.$directory, DIRECTORY_SEPARATOR)]; 
    } 

    if (! empty($directory) AND $params = Route::get('default')->matches(implode('/', $segments))) 
    { 
     $params['directory'] = rtrim($directory, DIRECTORY_SEPARATOR); 

     return $params; 
    } 
}, 
    // this is used for reverse routing 
    '<directory>(/<controller>(/<action>(/<id>)))') 
->defaults(array(
     'controller' => 'dashboard', 
     'action'  => 'index', 
    )); 
+0

私はあなたのアプローチを理解していますが、あなたの機能は最後のif条件で少し不明です。私はコントローラフォルダなどの検索を理解していますが、なぜそれをしなければならないでしょうか? Kohanaは設定が簡単な強力なルーティングシステムを持っていると考えられています。これは私のハックのようです。 – Piero

+0

$ directoryが空の場合、最初のセグメントはフォルダを反映しません。逆方向ルーティングルートにはオプションのが含まれているため、このルートと一致しないと言います。それがフォルダを反映している場合は、残りのuri(array_shift()に注意してください)を 'default'ルートと一致させます。一致する場合は、ディレクトリにパラメータを追加して戻ります。そのルートに 'default'ルートと同じデフォルトを与える必要があります。これをどのように実装できるかの例を覚えておいてください。このルートでは、ユーザー/リポジトリ/管理者/ダッシュボードをクラス/コントローラ/ユーザー/リポジトリ/管理者/ダッシュボードに導く必要があります。 – Darsstar

1

としては、あなたのルートのバックエンドは、あなたのデフォルトルートの前に来る必要がありウェイドと述べました。

は、その後、あなたが次のように定義されたコントローラを使用してバックエンドのフォルダのhome.phpを持っていることを確認してください。

class Controller_Backend_Home extends Controller { 
    public function action_index(){ 
    } 
} 
+0

クラスController_Backend_Home – Piero

関連する問題