Route::resourceを使おう【Laravel Routing】

2021/04/19に公開

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

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

Route::resourceとは

Route::resourceを使用すると、「一覧表示」「個別表示」「登録」「登録画面の表示」「更新」「更新画面の表示」「削除」のルーティングを作ることができます。

※ルーティングはLaravel8くらいから書き方変わったので注意してください。本記事はLaravel8の書き方です。

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

この一文で、「一覧表示」「個別表示」「登録」「登録画面の表示」「更新」「更新画面の表示」「削除」のルーティングが出来たことを確認してみます。

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

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

めちゃくちゃ簡単に、一度にたくさんのルーティングができましたね!

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

only を使用して使いたいメソッドだけ宣言するか、 except を使用して使わないメソッドを宣言するという2種類の方法があります。

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

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

全てのルートを使用しない場合は、きちんとこのように指定してあげたほうがいいでしょう。

このルーティングに対応するコントローラを作成するには下記の2つの方法が便利です。

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

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

やり方1つ目はControllerを作成する際に「resource」オプションをつけることです。

$ php artisan make:controller UserController --resource --model=User
Controller created successfully.

UsrControllerを見るとこうなっています。

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

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

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * 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  \App\Models\User  $user
     * @return \Illuminate\Http\Response
     */
    public function show(User $user)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\User  $user
     * @return \Illuminate\Http\Response
     */
    public function edit(User $user)
    {
        //
    }

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

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

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

やり方2つ目はModelを作成する際に「r」オプションをつけることです。

こちらはモデルも一緒に作りたい場合に便利です。
実はmake:Modelではモデルだけでなく、Controllerやマイグレーション、ファクトリ、シーダーなど様々なファイルを一気に作れるので、結構便利です。

いろいろなファイルを同じタイミングで作りたい場合はこちらのほうがおすすめです。

モデルと上記のControllerを同時に作りたい場合はこのコマンドを打ちます。

$ php artisan make:model User -r

mオプションをつけると、 モデルとコントローラに加えて、マイグレーションも作成できますが、このmake:Modelのオプションについてはこちらの記事で解説しています。

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

終わりに

今回は「Route::resource」について解説しました。

これを使わずに、ルーティング1つ1つ書いていると、web.phpの中身がすごいことになってしまうので、ぜひ使ってみてくださいね!

Discussion