schedule2019-05-23

APIルーティングでActionを制限する exceptとonly | Laravel5.8

APIのルーティングではGET, POST, PUT, DELETEといったHTTPリクエストに応じたコントローラーの関数を作ってくれるため、 Laravelでは統一感のあるRESTなAPIを手早く作れます。

exceptとonlyを指定することで、不要なリクエストは制限しておくべきです。

  • Laravel 5.8で確認

APIルーティングとアクション

/routes/api.phpに以下のようなAPIを作ってみました。

Route::resource('/user', 'Api\UsersController');

この状態でルーティングを表示するコマンド$ php artisan route:list -v`を叩くと以下のようになります。

| Domain | Method    | URI                          | Name             | Action                                                  | Middleware |
+--------+-----------+------------------------------+------------------+---------------------------------------------------------+------------+
|        | GET|HEAD  | /                            |                  | App\Http\Controllers\Web\HomeController@index           | web        |
|        | POST      | api/user                     | user.store       | App\Http\Controllers\Api\UserController@store           | api        |
|        | GET|HEAD  | api/user                     | user.index       | App\Http\Controllers\Api\UserController@index           | api        |
|        | GET|HEAD  | api/user/create              | user.create      | App\Http\Controllers\Api\UserController@create          | api        |
|        | DELETE    | api/user/{user}              | user.destroy     | App\Http\Controllers\Api\UserController@destroy         | api        |
|        | PUT|PATCH | api/user/{user}              | user.update      | App\Http\Controllers\Api\UserController@update          | api        |
|        | GET|HEAD  | api/user/{user}              | user.show        | App\Http\Controllers\Api\UserController@show            | api        |
|        | GET|HEAD  | api/user/{user}/edit         | user.edit        | App\Http\Controllers\Api\UserController@edit            | api        |
+--------+-----------+------------------------------+------------------+---------------------------------------------------------+------------+

7つのアクションの関数が作成されました。 毎回すべて使うことはないため、onlyとexceptで制限します。

only

onlyは利用するアクションだけ指定できます。 書き方は['only' => [利用するアクション]]です。

// indexとstoreのみ利用する
Route::resource('/user', 'Api\UsersController', ['only' => ['store','index']]);

この場合のroute:listは以下のようになり、storeindexに絞れました。

| Domain | Method    | URI                          | Name             | Action                                                  | Middleware |
+--------+-----------+------------------------------+------------------+---------------------------------------------------------+------------+
|        | GET|HEAD  | /                            |                  | App\Http\Controllers\Web\HomeController@index           | web        |
|        | POST      | api/user                     | user.store       | App\Http\Controllers\Api\UserController@store           | api        |
|        | GET|HEAD  | api/user                     | user.index       | App\Http\Controllers\Api\UserController@index           | api        |
+--------+-----------+------------------------------+------------------+---------------------------------------------------------+------------+

except

onlyとは逆に、除外するアクションを指定します。 書き方は['only' => [除外するアクション]]です。

// editとcreateは不要
Route::resource('/user', 'Api\UsersController', ['except' => ['edit','create']]);

この場合のroute:listは以下のようになり、editcreateは除外されます。

| Domain | Method    | URI                          | Name             | Action                                                  | Middleware |
+--------+-----------+------------------------------+------------------+---------------------------------------------------------+------------+
|        | GET|HEAD  | /                            |                  | App\Http\Controllers\Web\HomeController@index           | web        |
|        | POST      | api/user                     | user.store       | App\Http\Controllers\Api\UserController@store           | api        |
|        | GET|HEAD  | api/user                     | user.index       | App\Http\Controllers\Api\UserController@index           | api        |
|        | DELETE    | api/user/{user}              | user.destroy     | App\Http\Controllers\Api\UserController@destroy         | api        |
|        | PUT|PATCH | api/user/{user}              | user.update      | App\Http\Controllers\Api\UserController@update          | api        |
|        | GET|HEAD  | api/user/{user}              | user.show        | App\Http\Controllers\Api\UserController@show            | api        |
+--------+-----------+------------------------------+------------------+---------------------------------------------------------+------------+

参考

Laravelのおすすめ参考書

こちらの書籍でLaravelの全体像が分かりやすいです。 MVCの概念の説明から開発環境の構築、Laravelの基本的な機能について学べます。

PHPフレームワーク Laravel入門

  • バージョン:Laravel 5.4
  • OS:Windows, Mac OS対応

注意:HTML/CSSが解かる人向けです。基本からちょっと外れたこと(既存のDBを使う方法など)は載っていません。