2013-04-30 47 views
0

我正在構建一個CMS,並試圖在路線上使用更好的方法。比方說,我有一個「頁面」控制器和以下方法:「創建」,「編輯」和「刪除」。對於他們中的URI會是這樣的:Laravel 3.x - 自動檢測路線

admin/pages/create 
admin/pages/edit 
admin/pages/delete 

我可以硬編碼的路徑,一切會好一些,但它會在任何時候一塌糊塗。我已經搜查了很多,發現下面的代碼:

Route::any('admin/(.*)', array('defaults' => 'index', 'uses' => '[email protected](:1)')); 

的想法是從URL檢測方法,並在「admin.METHOD @」替換它。代碼將處理請求並將其引導至正確的控制器方法,但我無法弄清楚如何執行此操作。

任何幫助將是完美的。

回答

1

好了,你可以做到這一點在Laravel 3,但也有需要注意的幾個陷阱。首先這是它的外觀。

Route::any('admin/(:any)/(:any)', 'admin.(:1)@(:2)'); 

這將匹配的yourapp.dev/admin/pages/create一個URI,並將其路由到Admin_Pages_Controller控制器上的get_create方法。

你需要知道這裏的第一件事就是當有你的URI連字符。你最終可能會得到Admin_User-accounts_Controller,因爲Laravel沒有做任何檢測。在這些情況下,在路線中使用Controller::call()可能會更容易。

Route::any('admin/(:any)/(:any)', function($controller, $method) 
{ 
    return Controller::call("{$controller}@{$method}"); 
}); 

此時與前面的例子相同。您需要對變量進行任何替換和拼接套管。您也可以通過將該方法設置爲可選並恢復爲默認方法(如index)來採用該示例。

基本上你試圖實現的是資源豐富的路由,它在Laravel 4中處理得非常乾淨。我對Laravel 3 bundle存儲庫進行了快速搜索,並提出了Routely。從這個包的外觀來看,它爲你做了很多繁重的工作,而且可以自定義。

+0

我使用Routely現在。 TYVM爲這個有用的資源! – darksoulsong 2013-05-17 14:22:46

0

「Controller :: detect方法只是返回爲應用程序定義的所有控制器的數組。 - Laravel 3 docs

Route::controller(Controller::detect()); 
+1

我強烈建議人們避免使用這種方法,因爲檢測到的控制器的順序可能因系統而異,這通常會導致意外的行爲,其中包括一些投擲404s的路由。 – 2013-05-02 00:59:19

+0

我同意你的看法,我相信我們的其他解決方案都是最好的方法,但我知道人們喜歡有自己的選擇。儘管我會放棄一些額外的知識。 – aowie1 2013-05-11 03:35:11

0

理想情況下,您應該安心處理此問題,併爲每個HTTP動詞(請求方法)設置不同的路由。從那裏,也許你只是通過一個控制器發送所有的流量。

// Create 
Route::post('admin/(:any)', '[email protected](:1)'); 

// Edit 
Route::put('admin/(:any)', '[email protected](:1)'); 

// Delete 
Route::delete('admin/(:any)', '[email protected](:1)'); 

從這裏,你的控制器可以爲你想要處理的所有不同類型的事物定義方法。如post_pages(),put_modules(),delete_entries()等