【问题标题】:Laravel 4 only root route works - other routes return 'Controller method not found'Laravel 4 仅根路由有效 - 其他路由返回“找不到控制器方法”
【发布时间】:2014-12-14 14:50:39
【问题描述】:

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

唯一有效的路由是根目录,当我尝试转到另一条路由(例如 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('','LoginController@getIndex'); 并且 root 和其他路由仍然有效。但是,这样做时,当我单击页面上的登录按钮时,什么也没发生。

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

【问题讨论】:

    标签: php laravel laravel-4 laravel-routing


    【解决方案1】:

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

    当使用当前请求测试每个路由时,选择的路由将被编译并具有正则表达式模式。此模式将用于通过 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 或显式调用(@​​987654337@、Route::post、...)来处理您的顶级路由。

    【讨论】:

    • 很有趣……不过,您也可以将其声明为您的最后一条路线。
    • 是的,我已经更新了我的答案并将should never 更改为should not :)
    • 感谢您提供此信息。我刚刚添加了两条路线 Route::get 和 Route::post 来处理我的两种方法,只是为了安全起见。我猜关于您的最后一条评论,您不会建议只是将路线移动到路线文件的底部,尽管它似乎确实有效..
    【解决方案2】:

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

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

    编辑

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

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

    【讨论】:

    • 我想我以前试过,但我现在又试了一次,但不幸的是还是不行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2020-02-04
    • 2019-02-08
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多