2015-05-29 119 views
1

這種結構適用於(所有GET):/dashboard/video/dashboard/video/element/dashboard/video/create/dashboard/video/element/create/dashboard/video/element/{id},而不是/dashboard/video/{id}Laravel 5路線::嵌套路由裏面資源::組

換句話說,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('/', '[email protected]'); 
     Route::resource('/', 'InteractiveVideoController'); 

     Route::resource('element', 'InteractiveElementController'); 
    }); 
... 
}); 
+0

我可以通過添加類似'Route :: get('/ {id}','InteractiveVideoController @ show')來覆蓋資源聲明; '在資源聲明之前 - 而且工作正常 - 但這不是很乾淨,我想了解爲什麼資源聲明無法處理它。 –

回答

4

當你執行

php artisan route:list 

從生成的表,你可以看到這個問題會變得容易看到:

|  | GET|HEAD      | dashboard/video          | dashboard.video..index | App\Http\Controllers\[email protected]  |   | 
|  | GET|HEAD      | dashboard/video/create        | dashboard.video..create | App\Http\Controllers\[email protected]  |   | 
|  | POST       | dashboard/video          | dashboard.video..store | App\Http\Controllers\[email protected]  |   | 
|  | GET|HEAD      | dashboard/video/{}         | dashboard.video..show | App\Http\Controllers\[email protected]  |   | 
|  | GET|HEAD      | dashboard/video/{}/edit        | dashboard.video..edit | App\Http\Controllers\[email protected]  |   | 
|  | PUT       | dashboard/video/{}         | dashboard.video..update | App\Http\Controllers\[email protected]  |   | 
|  | PATCH       | dashboard/video/{}         |       | App\Http\Controllers\[email protected]  |   | 
|  | DELETE       | dashboard/video/{}         | dashboard.video..destroy | App\Http\Controllers\[email protected] |   | 

正如你可以通過定義爲/視頻路線見在視頻組下不起作用,僅僅是因爲爲了使資源控制器創建具有參數的寧靜路徑,它使用路徑的第一部分作爲變量名稱。在你的情況下它是空的(只是斜槓/被剝離),這就是爲什麼你得到這個{}

你必須改變你的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', '[email protected]'); 
    Route::resource('video', 'InteractiveVideoController'); 

}); 

你必須把視頻資源下的視頻元素,否則video/element永遠匹配,因爲定義的路線的順序很重要。

這將適用於您,現在所有頁面將正常打開。您也可以通過再次執行來檢查路由是否正確定義:

php artisan route:list 

|  | GET|HEAD      | dashboard/video          | dashboard.video.index | App\Http\Controllers\[email protected]  |   | 
|  | GET|HEAD      | dashboard/video/create        | dashboard.video.create | App\Http\Controllers\[email protected]  |   | 
|  | POST       | dashboard/video          | dashboard.video.store | App\Http\Controllers\[email protected]  |   | 
|  | GET|HEAD      | dashboard/video/{video}         | dashboard.video.show | App\Http\Controllers\[email protected]  |   | 
|  | GET|HEAD      | dashboard/video/{video}/edit        | dashboard.video.edit | App\Http\Controllers\[email protected]  |   | 
|  | PUT       | dashboard/video/{video}         | dashboard.video.update | App\Http\Controllers\[email protected]  |   | 
|  | PATCH       | dashboard/video/{video}         |       | App\Http\Controllers\[email protected]  |   | 
|  | DELETE       | dashboard/video/{video}         | dashboard.video.destroy | App\Http\Controllers\[email protected] |   | 
+0

總體意義。我學到了一個非常有用的工匠指揮。 –