問題
RESTFulコントローラーでは、URLは下記のようになってほしい。
api/v1/projects/1
ただしLaravel5系ではこうなる。
api/v1/project/1
Laravelのドキュメントでは単数形と複数形が混ざっており、フレームワーク内でも統一が取れていない。
Railsのように、
Route::resource('projects', 'ProjectController')
とすることで
メソッド | URL | コントローラー |
---|---|---|
GET | /projects | ProjectController@index |
PUT | /projects/{project} | ProjectController@update |
などとなって欲しいが、
メソッド | URL | コントローラー |
---|---|---|
GET | /projects | ProjectController@index |
PUT | /projects/{projects} | ProjectController@update |
となってしまう。
その結果、ルーティングの変数が複数形になり、Route Model Bindingをしようとすると
app/Providers/RouteServiceProvider.php
public function boot(Router $router)
{
parent::boot($router);
$router->model('projects', 'App\Models\Project');
}
という奇妙なことになってしまう。
ProjectController.php
public function update(Project $project)
{
// 等価
// $project = Project->findOrFail($project_id);
}
とできるのは便利なんだけど。
解決策
下記にすることで可能っぽい。
routes/web.php
Route::singularResourceParameters();
Route::resource('projects','ProjectController');
5.2から加わったらしい。
所感
そもそも5.4ではRESTFulコントローラーにしただけで Route Model Binding が有効になるのでさっさとバージョンアップしろって話なのか。
でもドキュメントでも複数形と単数形の統一は取って欲しい・・・というか全部複数形にしてほしい。