2011-11-14 59 views
1

我在kohana 3.2應用程序的/ application/classes/controller /中創建了一個「後端」文件夾。kohana 3:如何爲後端部分創建路由?

所以我有一個文件夾結構,如:

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

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

我有一個重寫我的網址一個.htaccess並刪除「的index.php 「從網址,所以我通常這樣稱呼一個頁面: www.mysite.com/controller_name/action_name

從我在路線文檔中讀到的,與」後端「ro ute我寫道,這應該工作: www.mysite.com/backend/controller_name/action_name

但它does not ...任何想法爲什麼?

回答

2

問題是您的路線中有<directory>。當Kohana嘗試加載您的路線時,這將改變目錄值。你的後端路線應該像這樣。

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

注意:此路線必須位於默認的全路徑路線之前。否則Kohana將永遠不會走到你的路線。

+0

nope,我也試過這個,它沒有解決任何問題。路由:: set中的將被默認數組中的'目錄'值替換... – 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

爲避免這種情況,我們需要在directory based路由後列出那些路由。是的,這很奇怪。但這是它如何爲kohana工作。我希望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後給出'hello world'響應。 – Darsstar

+0

你試過了嗎? http://kohanaframework.org/3.2/guide/kohana/routing#lambdacallback-route-logic – Kowser

1

您可以定義兩條路線,並且不要爲任何段超載正則表達式。段的默認正則表達式是[^/.,;?\n]++,因此每個段都必須匹配該正則表達式。

您的第一條線路是開箱即用的Kohana路線。它將匹配由斜槓分隔的0,1,2和3段。 你的第二條路線將匹配1,2,3和4段。

由於您按照該順序添加它們,因此名爲'default'的路由只會匹配多於三個這樣的uri:user/purcheses/view/42三個區段。當路由'default'與uri不匹配時,下一條路由將被檢查。在你的情況下,名爲'後端'的路線。

如果交換兩條路線的順序,那麼路由'後端'將是第一個,並且只會失敗0或更多,然後4段。對於0段,路由'默認'將匹配它,並與5個或更多的段將引發Http_Exception_404。 但是,當您首先放置'後端'時,它將只會路由到子目錄中的控制器,這很可能會打破很多頁面。

你可以用一個硬編碼值替換<directory>,爲其添加一個正則表達式或者創建一個lambda /回調路由。

爲了:

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

我理解你的方法,但是最後的條件你的功能有點不清楚。我理解搜索到控制器文件夾等,但爲什麼我必須這樣做? Kohana假設有一個強大的路由系統,易於配置,這對我來說看起來像一個黑客。 – Piero

+0

如果$目錄爲空,則第一個段不反映文件夾。由於反向路由路由包含非可選,我們可以說它不匹配此路由。如果它確實反映文件夾,請將剩餘的uri(注意array_shift())與「默認」路線相匹配。如果這是匹配,則將目錄添加到參數並返回。您應該爲該路線指定與「默認」路線相同的默認路線。記住這只是你如何實現它的一個例子。這條路線也應該將用戶/資料庫/管理員/儀表板路由到類/控制器/用戶/資料庫/ admin/dashboard.php – Darsstar

1

正如韋德所說路線後端有來你的默認路由之前。

然後檢查你已經在你的後端文件夾中的home.php與定義如下控制器:

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

class Controller_Backend_Home,這正是我所缺少的... – Piero