以前に、Route::resource
の便利さを紹介しました。
また、名前付きrouteがもたらす便宜さも紹介しました。
しかし、Laravel 5.3のバージョンアップで「ちょっと、それはないよ」みたいな問題が出てきました。
Route::resource
では、名前付きrouteが自動で作成されます。
例えば、Laravel 5.2では、routes.php
にこう設定すると、
Route::group(['prefix' => 'admin', 'middleware' => 'web', 'namespace' => 'Admin'], function () { Route::resource('product', 'ProductController'); });
以下のように名前付きroutesがprefixをもとに設定されます。「Name」の列です。
+--------+-----------+------------------------------+-----------------------+---------------------------------------------------------------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+------------------------------+-----------------------+---------------------------------------------------------------+------------+ | | POST | admin/product | admin.product.store | App\Http\Controllers\Admin\ProductController@store | web,web | | | GET|HEAD | admin/product | admin.product.index | App\Http\Controllers\Admin\ProductController@index | web,web | | | GET|HEAD | admin/product/create | admin.product.create | App\Http\Controllers\Admin\ProductController@create | web,web | | | DELETE | admin/product/{product} | admin.product.destroy | App\Http\Controllers\Admin\ProductController@destroy | web,web | | | PUT|PATCH | admin/product/{product} | admin.product.update | App\Http\Controllers\Admin\ProductController@update | web,web | | | GET|HEAD | admin/product/{product} | admin.product.show | App\Http\Controllers\Admin\ProductController@show | web,web | | | GET|HEAD | admin/product/{product}/edit | admin.product.edit | App\Http\Controllers\Admin\ProductController@edit | web,web | +--------+-----------+------------------------------+-----------------------+---------------------------------------------------------------+------------+
しかし、おなじ、routes.phpをLaravel 5.3に持っていくと(もちろん、web.phpと改名して、app/Httpからroutes/のディレクトリに移して)、
+--------+-----------+------------------------------+-----------------+---------------------------------------------------------------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+------------------------------+-----------------+---------------------------------------------------------------+------------+ | | POST | admin/product | product.store | App\Http\Controllers\Admin\ProductController@store | web,web | | | GET|HEAD | admin/product | product.index | App\Http\Controllers\Admin\ProductController@index | web,web | | | GET|HEAD | admin/product/create | product.create | App\Http\Controllers\Admin\ProductController@create | web,web | | | DELETE | admin/product/{product} | product.destroy | App\Http\Controllers\Admin\ProductController@destroy | web,web | | | PUT|PATCH | admin/product/{product} | product.update | App\Http\Controllers\Admin\ProductController@update | web,web | | | GET|HEAD | admin/product/{product} | product.show | App\Http\Controllers\Admin\ProductController@show | web,web | | | GET|HEAD | admin/product/{product}/edit | product.edit | App\Http\Controllers\Admin\ProductController@edit | web,web | +--------+-----------+------------------------------+-----------------+---------------------------------------------------------------+------------+
なんと!
admin.product.store ⇒ product.store とadmin.が皆消えてしまいました。
ドキュメントを読むと、どうもこのprefix
の設定は、resourceの名前付きrouteに反映される意図はなかったとのことで、5.3で修正という訳です。
以前と同様な、名前付きのrouteとするためには、as
を使用して、以下のように設定します。
Route::group(['prefix' => 'admin', 'as' => 'admin.', 'middleware' => 'web', 'namespace' => 'Admin'], function () { Route::resource('product', 'ProductController'); });
注意:admin
でなく、admin.
です。最後にドットが必要。
あるいは、ひとつひとつを命名するというオプションもあります。しかし、これはちょっと。。
Route::group(['prefix' => 'admin', 'middleware' => 'web', 'namespace' => 'Admin'], function () { Route::resource('product', 'ProductController', ['names' => ['index' => 'admin.product.index']]); });メルマガ購読の申し込みはこちらから。