Route:apiRresourceを使おう【Laravel Routing】

4 min read読了の目安(約3900字

今回はルーティングに関して、便利機能を紹介します。

「Route::apiResource」は簡単にCRUDのルーティングが作れる優れもので、ルーティングの記述がコンパクトに分かりやすくなります。

また「Route::resource」とは違ってAPI開発に特化にしたルーティングとなっているので、いつもAPI開発してるから「Route::resource」とは無縁なんだよ〜〜っていう人はこちらをおすすめします。

Route:apiRresourceとは

Route::apiResourceを使用すると、「一覧取得」「個別取得」「登録」「更新」「削除」のルーティングを作ることができます。
APiの場合は登録画面と更新画面の表示が必要ないのでRoute::resourceより数が少なくなっています。

Route::apiResource('user', UserController::class);

php artisan route::list と打つと定義されているルーティングの一覧が表示されます。

$ php artisan route:list
+--------+-----------+-----------------+--------------+-------------------------------------------------+------------+
| Domain | Method    | URI             | Name         | Action                                          | Middleware |
+--------+-----------+-----------------+--------------+-------------------------------------------------+------------+
|        | GET|HEAD  | api/user        | user.index   | App\Http\Controllers\Api\UserController@index   | api        |
|        | POST      | api/user        | user.store   | App\Http\Controllers\Api\UserController@store   | api        |
|        | GET|HEAD  | api/user/{user} | user.show    | App\Http\Controllers\Api\UserController@show    | api        |
|        | PUT|PATCH | api/user/{user} | user.update  | App\Http\Controllers\Api\UserController@update  | api        |
|        | DELETE    | api/user/{user} | user.destroy | App\Http\Controllers\Api\UserController@destroy | api        |
+--------+-----------+-----------------+--------------+-------------------------------------------------+------------+

これで5つのルートが定義されました!

定義したルーティングの一部だけ使いたい場合

apiResourceのルートの内一部だけ使いたい場合は公式ページにやり方が書かれていないですが、「Route::resource」の方法と同じ方法でできます。

1つはonlyを使う方法で、こちらは使用したいルートを宣言する方法です。
もう一つはexceptを使う方法で、こちらは使用したくないルートを宣言する方法です。

Route::apiResource('users', UserController::class)->only([
    'index', 'show'
]);

Route::apiResource('users', UserController::class)->except([
    'create', 'store', 'update', 'destroy'
]);

使用したいルートを宣言するほうが分かりやすいと、個人的には思っています。

Route::apiResourceに対応するControllerを簡単に作る

make:controllerの「api」オプション

Controllerを作成する際に「api」オプションを付けると、作成できます。

$ php artisan make:controller Api/UserController --api
Controller created successfully.

実際に作成されたControllerはこのような感じです。

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

make:modelの「api」オプション

make:Modelでも「api」オプションをつけると、モデルとapiResourceに対応するControllerを作成できます。

$ php artisan make:model User --api

コントローラと一緒にモデルも作成シたい場合はこちらがおすすめです。
また、make:Modelの他のオプションでファクトリやシーダー、マイグレーションなど関連ファイルも作成できるので、関連ファイルを一気に作成したい場合はmake:Modelでオプションを付けてファイル生成することをおすすめします。

make:Modelのオプションについてはこちらで解説しています。

https://zenn.dev/naoki_oshiumi/articles/6d6feeff61d5a3

終わりに

AP開発ではない場合は「Route::resource」、API開発の場合は「Route::apiResource」が便利ですので、必要に応じて使い分けてみてくださいね!