Laravel 5 Route ::资源在嵌套的Route :: group中

Jim*_*oto 2 php laravel-5

这种结构适用于(所有GET): , ,/dashboard/video,,/dashboard/video/element ,但不适合./dashboard/video/create/dashboard/video/element/create/dashboard/video/element/{id}/dashboard/video/{id}

换句话说,show($id)没有被要求/dashboard/video/{id}.

知道为什么吗?

Route::group(['prefix' => 'dashboard', 'middleware' => ['csrf', 'auth']], function () {

    Route::group(['prefix' => 'video'], function() {

        // non-standard delete: sends array of ids in request body
        Route::delete('/', 'InteractiveVideoController@destroyMany');
        Route::resource('/', 'InteractiveVideoController');

        Route::resource('element', 'InteractiveElementController');
    });
...
});
Run Code Online (Sandbox Code Playgroud)

sha*_*ddy 5

执行时,问题可以很容易看到

php artisan route:list
Run Code Online (Sandbox Code Playgroud)

从生成的表中可以看到:

|        | GET|HEAD                       | dashboard/video                                       | dashboard.video..index   | App\Http\Controllers\InteractiveVideoController@index      |            |
|        | GET|HEAD                       | dashboard/video/create                                | dashboard.video..create  | App\Http\Controllers\InteractiveVideoController@create     |            |
|        | POST                           | dashboard/video                                       | dashboard.video..store   | App\Http\Controllers\InteractiveVideoController@store      |            |
|        | GET|HEAD                       | dashboard/video/{}                                    | dashboard.video..show    | App\Http\Controllers\InteractiveVideoController@show       |            |
|        | GET|HEAD                       | dashboard/video/{}/edit                               | dashboard.video..edit    | App\Http\Controllers\InteractiveVideoController@edit       |            |
|        | PUT                            | dashboard/video/{}                                    | dashboard.video..update  | App\Http\Controllers\InteractiveVideoController@update     |            |
|        | PATCH                          | dashboard/video/{}                                    |                          | App\Http\Controllers\InteractiveVideoController@update     |            |
|        | DELETE                         | dashboard/video/{}                                    | dashboard.video..destroy | App\Http\Controllers\InteractiveVideoController@destroy    |            |
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,通过将视频路由定义为/视频组下的组将无法工作,只是因为为了使资源控制器创建带参数的restful路径,它将路径的第一部分用作变量名称.在你的情况下它是空的(只是一个/被剥离的斜线),这就是你得到它的原因{}.

您必须更改routes.php并将视频资源移出组,它将起作用,如下所示:

Route::group(['prefix' => 'dashboard'], function () {

    Route::group(['prefix' => 'video'], function() {

        Route::resource('element', 'InteractiveElementController');
    });

    // non-standard delete: sends array of ids in request body
    Route::delete('video', 'InteractiveVideoController@destroyMany');
    Route::resource('video', 'InteractiveVideoController');

});
Run Code Online (Sandbox Code Playgroud)

您必须将视频资源放在视频元素下,否则video/element永远不会匹配,因为定义的路由顺序很重要.

这对您有用,现在所有页面都会正常打开.您还可以通过再次执行来检查路由是否已正确定义:

php artisan route:list

|        | GET|HEAD                       | dashboard/video                                       | dashboard.video.index   | App\Http\Controllers\InteractiveVideoController@index      |            |
|        | GET|HEAD                       | dashboard/video/create                                | dashboard.video.create  | App\Http\Controllers\InteractiveVideoController@create     |            |
|        | POST                           | dashboard/video                                       | dashboard.video.store   | App\Http\Controllers\InteractiveVideoController@store      |            |
|        | GET|HEAD                       | dashboard/video/{video}                                    | dashboard.video.show    | App\Http\Controllers\InteractiveVideoController@show       |            |
|        | GET|HEAD                       | dashboard/video/{video}/edit                               | dashboard.video.edit    | App\Http\Controllers\InteractiveVideoController@edit       |            |
|        | PUT                            | dashboard/video/{video}                                    | dashboard.video.update  | App\Http\Controllers\InteractiveVideoController@update     |            |
|        | PATCH                          | dashboard/video/{video}                                    |                          | App\Http\Controllers\InteractiveVideoController@update     |            |
|        | DELETE                         | dashboard/video/{video}                                    | dashboard.video.destroy | App\Http\Controllers\InteractiveVideoController@destroy    |            |
Run Code Online (Sandbox Code Playgroud)