LoginSignup
1
1

More than 5 years have passed since last update.

LaravelのRESTFulコントローラーで単数形のURLを使いたい

Last updated at Posted at 2017-06-22

問題

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 が有効になるのでさっさとバージョンアップしろって話なのか。

でもドキュメントでも複数形と単数形の統一は取って欲しい・・・というか全部複数形にしてほしい。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1