WEB開発でよく出てくるLaravelの小技集

はじめまして。入社して一ヶ月が経った、おっくんです。

入社前までフルテレワークだったので、フル出社なのが不安でしたが、通勤も悪くないなと思い始めています。

通勤はなんだかんだ良い運動になるし、昼休み時間に梅田近辺のいろんなお店に行けるし、オフィスビルの下のベンチに座って、日光浴もできて、健康に良いです。

今回はLaravelでウェブ開発をしていて、よく出てくるLaravelのテクニックをご紹介します。

    リクエストに値があるかどうかの判定

    フリー検索ワードの実装で、画面から検索ワードのリクエストで送られてきたら、検索条件に加えるという処理がよくあると思います。
    具体的には下記のようなコードです。

    app/Http/Controllers/GoodsController.php

    public function index(Request $request) {
       //
       $goods_q = Good::query();
       // キーワードから検索処理
        if ($request->filled('keyword')) {
            $keyword = $request->keyword;
            $goods_q->where(function ($query) use ($keyword) {
                $query->where('name', 'LIKE', "%${keyword}%")
                    ->orWhere('note', 'LIKE', "%${keyword}%");        });
        }
        $goods_q->orderBy('created_at', 'desc');
        // ページネーション
        $goods = $goods_q->paginate(5);
        return view('goods.index', compact('goods'));
    }

    このとき、filledメソッドを使えば、リクエストに値が存在し、空文字列でないことが判定できます。
    検索処理などで、リクエストの値を判定する時に向いています。

    // フリーワード
    if ($request->filled('keyword')) {
        $keyword = $request->keyword;
        $goods_q->where(function ($query) use ($keyword) {
            $query->where('name', 'LIKE', "%${keyword}%")
                ->orWhere('note', 'LIKE', "%${keyword}%");
        });
    }
    似たようなメソッドに、hasメソッドがあります。
    hasメソッドはfilledメソッドと同様に、リクエストに値が存在するかを判定しますが、空文字判定はしません
    if ($request->has('keyword')) {
        // ...
    }

    設定値に便利なEnum

    PHP8.1で登場したEumがとても便利です。

    これまで設定値を管理するときに、config配下にファイルを作って、配列で管理していました。

    例えば、下記のような感じです。
    config/shingo.php

    <?php
    return [
        'shingo' => [
            'blue' => '青',
            'yellow' => '黄',
            'red' => '赤',
        ],
    ];

    しかしconfigの配列で管理してしまうと、誤って値を更新してしまったり、存在しないキーを指定してしまい、エラーが起きたり、管理が大変になります。

    enumは、変更できないキーと値を設定できるので、ラジオボタンの候補値を設定したり、プログラム上で必要な設定値を管理するのに重宝します。

    上のconfigファイルをenumに書き換えると、下記になります。

    <?php
    
    namespaceApp\Enums;
    enum ShingoStatusType: string
    {
        case BLUE = 'blue';
        case YELLOW = 'yellow';
        case RED = 'red';
    }

    可読性も上がりますね。値を取り出す時は下記のようにvalueメソッドを使用します。

    echo ShingoStatusType::BLUE->value; // blue

    また、labelメソッドを下記のように記載しておくと、ラジオボタンの候補値などの表示にとても便利です。

    <?php
    
    
    namespaceApp\Enums;
    
    
    enum ShingoStatusType: string
    {
    
        case BLUE = 'blue';
        case YELLOW = 'yellow';
        case RED = 'red';
    
    
        public function label(): string
        {
            return match($this) {
                ShingoStatusType::BLUE =>'青',
                ShingoStatusType::YELLOW =>'黄',
                ShingoStatusType::RED =>'赤',
            };
        }
    }

    例えば、labelメソッドを使って、「青」という文字を画面に出したい場合は、下記のように、fromメソッドの引数にvalueを指定することで、表示できます。

    <label>{{ \App\Enums\ShingoStatusType::from('blue')->label() }}</label>
    実行結果

    また、ラジオボタンのすべての候補値を画面に出したい場合は
    casesで全ケースを取得し、ループで表示します。
    <div>
        <label for="shingo">信号: </label>
        <div>
            @foreach(\App\Enums\ShingoStatusType::cases() as $shingo)
            <input type="radio" id="{{ $shingo->value }}" name="shingo" value="{{ $shingo->value }}">
                {{ \App\Enums\ShingoStatusType::from($shingo->value)->label() }}
            </input>
            @endforeach
        </div>
    </div>

    実行結果

    このようにEnumを活用することで、設定値の管理が格段に楽になります。configファイルの大量の配列に悩まされていた方は、ぜひEnumを試してみてください。

    PHP8.1以降で利用可能なので、導入してみる価値は大いにあります!

    Bladeでよく出てくる処理

    1. old関数
      <input type="text" name="email" value="{{ old('email') }}" >
      bladeのフォームでバリデーションに引っかかった時に、引っかかる前に入力していた値がinputタグに入っていてほしい時に使用します。
    2. @checked
      <input type="checkbox"
              name="active"
              value="active"
              @checked(old('active', $user->active)) />
      チェックボックスのチェック状態を管理するために、@checkedを使用します。
      この場合、old関数のactiveに何らかの値があったら、checkedが入り、逆に、値がない場合、$user->activeの値で判定されます。$user->activeに何らかの値があったら、checkedが入り、それ以外の場合はcheckedが入りません。

      @ifで判定処理を書いていた方は、こちらを使用していただけると、よりスマートに書けます。

      @selectedや@disabledなど、その他にも判定処理があるので、詳しくは公式ドキュメントを参照ください。
      https://readouble.com/laravel/10.x/ja/blade.html#additional-attributes

    3. @foreach

      @foreach ($users as $user)
          @if ($loop->first)
              これが最初の繰り返しです。
          @endif
          @if ($loop->last)
              これが最後の繰り返しです。
          @endif
          <p>このユーザーは:{{ $user->id }}</p>
      @endforeach
      一覧表示やチェックボックスの候補値の表示など、繰り返し処理が伴う、様々な場面で登場します。
      foreachでコレクションや配列の中身を展開し、コレクションの場合は、メソッドチェーン(->)で値を取得し、画面表示できます。
      $loop->firstでループの最初に何か処理を挟んだり、$loop変数を使って、ループに関わる様々な処理を行えます。詳しくは公式ドキュメントを参照ください。
      https://readouble.com/laravel/10.x/ja/blade.html#the-loop-variable

    まとめ

    Laravelにはまだまだ多くの便利な機能やテクニックがあるので、ぜひ公式ドキュメントを参照しながら、実践で役立ててください(自戒)。

    また、深掘りしたテクニックや、新しい機能についてご紹介したいと思います。お楽しみに!

    スタッフ積極採用中

    ジェイオンラインではスタッフを随時募集しております。
    採用情報ページよりお気軽にお問い合わせください。

    この記事を書いた人

    おっくん
    事務職などを経て、現在はWEBエンジニアを務めています。趣味は卓球、海外ドラマ、映画です。