【问题标题】:Routes don't work correctly at Laravel 5.0 (404 Error)路由在 Laravel 5.0 中无法正常工作(404 错误)
【发布时间】:2015-07-26 08:19:06
【问题描述】:

我切换到 Laravel 5.0 并尝试自我介绍。

我有一个小问题让我很困惑:

我使用两个控制器类。第一个工作正常,但第二个被忽略。谁能告诉我为什么?

routes.php

<?php
Route::controller('/', 'IndexController');
Route::controller('/rezeptliste', 'RecipelistController');

IndexController.php

<?php namespace App\Http\Controllers;

class IndexController extends Controller {
    public function getIndex() {
        return view('index');
    }
}

食谱控制器

<?php namespace App\Http\Controllers;

class RecipelistController extends Controller {
    public function getIndex() {
        return view('recipelist');
    }
}

当我访问 / 时,它运行良好。当我尝试访问 /rezeptliste 时,出现以下错误:

NotFoundHttpException in Controller.php line 259:
Controller method not found.
in Controller.php line 259
at Controller->missingMethod('rezeptliste')
at call_user_func_array(array(object(IndexController), 'missingMethod'), array('_missing' => 'rezeptliste')) in Controller.php line 246
at Controller->callAction('missingMethod', array('_missing' => 'rezeptliste')) in ControllerDispatcher.php line 162
at ControllerDispatcher->call(object(IndexController), object(Route), 'missingMethod') in ControllerDispatcher.php line 107
at ControllerDispatcher->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 141
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 101
at Pipeline->then(object(Closure)) in ControllerDispatcher.php line 108
at ControllerDispatcher->callWithinStack(object(IndexController), object(Route), object(Request), 'missingMethod') in ControllerDispatcher.php line 67
at ControllerDispatcher->dispatch(object(Route), object(Request), 'App\Http\Controllers\IndexController', 'missingMethod') in Route.php line 204
at Route->runWithCustomDispatcher(object(Request)) in Route.php line 134
at Route->run(object(Request)) in Router.php line 701
at Router->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 141
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 101
at Pipeline->then(object(Closure)) in Router.php line 703
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 670
at Router->dispatchToRoute(object(Request)) in Router.php line 628
at Router->dispatch(object(Request)) in Kernel.php line 214
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 141
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in VerifyCsrfToken.php line 43
at VerifyCsrfToken->handle(object(Request), object(Closure)) in VerifyCsrfToken.php line 17
at VerifyCsrfToken->handle(object(Request), object(Closure)) in Pipeline.php line 125
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in ShareErrorsFromSession.php line 55
at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 125
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in StartSession.php line 61
at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 125
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 36
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 125
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in EncryptCookies.php line 40
at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 125
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in CheckForMaintenanceMode.php line 42
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 125
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 101
at Pipeline->then(object(Closure)) in Kernel.php line 115
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 84
at Kernel->handle(object(Request)) in index.php line 53

【问题讨论】:

    标签: php laravel routes


    【解决方案1】:

    这里的问题是,在 Laravel 中,路由是按列出的顺序计算的。

    这意味着由于你的第一个路由 '/' 也匹配路由 /rezeptliste,laravel 将改为转到 IndexController 并寻找一个名为“rezeptliste”的方法。

    相反,您的路线应该这样排序:

    <?php
    Route::controller('/rezeptliste', 'RecipelistController');
    Route::controller('/', 'IndexController');
    

    这样您的/rezeptliste 专用网址将首先被“捕获”并发送到RecipelistController,而不是被IndexController 路由捕获。

    【讨论】:

    • 工作正常!非常感谢。但奇怪的是Route::get('/', 'IndexController@getIndex'); Route::get('/chart/{duration}', 'ChartController@getChartData');在 Laravel 4.0 中运行良好
    • 那是因为/chart/10"/"的路由不匹配。但是在您使用 rezeptliste 的新案例中,路线匹配。
    【解决方案2】:

    参见the docs向资源控制器添加额外路由部分

    如果您需要向资源控制器添加默认资源路由之外的其他路由,则应在调用 Route::resource: 之前定义这些路由:

    Route::get('photos/popular', 'PhotoController@method');
    Route::resource('photos', 'PhotoController');
    

    【讨论】:

      【解决方案3】:

      如果你使用 Route:controller() 那么你也必须在你的控制器方法中提到请求类型。像这样

      class UserController extends Controller{
          public function getUserinfo(){
              //
          }
      
          public function postNewuser(){
              //
          }
      
      }
      

      这样路由可以轻松识别你的请求方法。

      现在你可以配置你的路线

      Route::controller('user','UserController');
      

      我认为它会很好用

      【讨论】:

        猜你喜欢
        • 2011-12-21
        • 2018-01-17
        • 2017-10-15
        • 1970-01-01
        • 2016-12-05
        • 2011-12-09
        • 1970-01-01
        相关资源
        最近更新 更多