2014-10-19 155 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