2014-10-19 157 views
0

我已經在linux主機上的域上設置了laravel,並且我已經設置了WAMP本地主機。Laravel 4只有根路由工程 - 其他路由返回'未找到控制器方法'

工作的唯一途徑是根,當我嘗試去其他路線,如domain.com/account我得到一個「找不到控制器方法。」錯誤。

在我的routes.php文件的文件我有:

Route::controller('','LoginController'); 
Route::controller('account', 'AccountController'); 

在我的LoginController,我只有兩個方法。 getIndexpostIndex

經過幾個小時的谷歌搜索沒有結果,玩弄路線文件之間的東西,仍然沒有奏效。

我試着添加下面的路線,但是沒有工作。

Route::any('hello', function(){ 
    return 'hello!'; 
}); 

不過,我再註釋掉我Route::controller('','LoginController');線和其他線路開始工作!

然後我將其更改爲Route::controller('login','LoginController');,這和其他路線仍然有效。然後我將其更改爲Route::any('','[email protected]');,並且根路徑和其他路徑仍然有效。但是,通過這種方式,當我在頁面上登錄登錄按鈕時,什麼也沒有發生。

所以我的問題真的是,有沒有做錯Route::controller('','LoginController');?由於一切似乎「工作」

回答

3

Laravel節省註冊路線的內部集合在$routes成員Router班。在發送請求時,將執行從當前請求中採集此測試集合中的每個元素並進行測試的過程,以確定將處理哪條路由。此過程受您的路由註冊語句的順序影響。

當使用當前請求測試每個路由時,拾取的路由將被編譯並具有正則表達式模式。此模式將用於通過preg_match函數檢查當前URI,如您在this line in Laravel source中所看到的。

使用Route::controller時,將會爲您的routes系列添加特殊路線。如果您的輸入是Route::controller($uri, $controller),那麼這條特殊路線將具有正則表達式模式作爲^/$uri/?P<_missing>(.*)$並且它告訴Laravel該請求屬於$controller控制器類的缺失方法。

在你的情況,你的$uri值設置爲空字符串,導致特殊的路由的正則表達式是^/?P<_missing>(.*)$設置$uri以字符串/造成同樣的效果)。那麼,這個正則表達式將匹配 URI。因此,查看此特殊路線時,內部路線查找過程將會中止。這是拋出異常的原因。

在使用Route::controller方法進行註冊時,不應使用空字符串或/字符串。相反,請使用Route::resource或顯式調用(Route::get,Route::post,...)來處理您的頂級路線。

+0

知道的很有意思......但您也可以將其聲明爲最後一條路線。 – rmobis 2014-10-19 16:13:40

+0

是的,我已經更新了我的答案,並改變'不應該'應該'不應該':) – 2014-10-19 16:23:46

+0

感謝這個信息。我剛剛添加了兩個路由Route :: get和Route :: post來處理我的兩個方法,只是爲了安全起見。我猜你最近的評論,你不會建議只是簡單地將路線移動到路線文件的底部,雖然它似乎工作.. – Nathan 2014-10-19 16:25:49

0

我還沒有嘗試過,但也許你可以添加一個「/」:

Route::controller('/','LoginController'); 

編輯

我能夠重現問題,我解決了通過更改路由線的順序:

Route::controller('accounts', 'AccountController'); 
Route::controller('','LoginController'); 
+0

我想我以前曾嘗試過,但我現在再試過一次,但仍然無法工作。 – Nathan 2014-10-19 15:44:12

+0

請參閱我的更新回答 – 2014-10-19 16:38:43