Laravel 4只有根路由工作 - 其他路由返回'未找到控制器方法'

时间:2014-10-19 15:00:23

标签: php laravel laravel-4 laravel-routing

我已经在linux主机上的域上设置了laravel,并且我已经设置了WAMP本地主机。

唯一有效的路由是root,当我尝试转到另一个路由,例如domain.com/account时,我得到一个"找不到Controller方法。"错误。

在我的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('','LoginController@getIndex');,根和其他路由仍然有效。但是,这样做,当我在我的页面上登录按钮时没有发生任何事情。

所以我的问题是,Route::controller('','LoginController');有什么问题吗?其他一切似乎都在工作'

2 个答案:

答案 0 :(得分:3)

Laravel在$routes类的Router成员中保存已注册路由的内部集合。在调度请求时,将执行从此集合中挑选每个元素并使用当前请求进行测试的过程,以找出将处理的路径。此过程受路由注册语句的顺序影响。

当使用当前请求测试每个路由时,将编译拾取的路由并具有正则表达式模式。如this line in Laravel source所示,此模式将用于preg_match函数检查当前URI。

使用Route::controller时,系统会将特殊路线添加到您的routes集合中。如果您的输入为Route::controller($uri, $controller),则此特殊路由将具有正则表达式^/$uri/?P<_missing>(.*)$,并告知Laravel此请求属于$controller的缺失方法控制器类。

在您的情况下,您已将$uri的值设置为空字符串,这会导致特殊路由的正则表达式为^/?P<_missing>(.*)$设置$uri字符串/会产生同样的效果)。好吧,这个正则表达式将匹配每个 URI。因此,当查看此特殊路线时,内部路线查找过程将中止。这是抛出异常的原因。

使用/方法注册时,不应使用空字符串或Route::controller字符串。相反,请使用Route::resource或显式调用(Route::getRoute::post,...)来处理您的顶级路由。

答案 1 :(得分:0)

我没试过,但也许你可以添加一个“/”:

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

修改

我能够重现这个问题,我通过更改路线的顺序解决了问题:

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