【Laravel9】今すぐ業務に使えそうな新機能を試してみた!!

こんにちは!ドイです。

今回は、最近の案件でLaravel9をさわる機会があったので、新しく追加された機能についてまとめていきたいと思います。

Enum

PHP 8.1から使えるようになったEnumをLaravel9でも使用できるようになりました。

Enumとは

PHPのドキュメントには下記のように説明されています。

列挙型は、多くのプログラミング言語に備わっており、 様々な異なる機能があります。 PHP では、列挙型は特別な種類のオブジェクトです。 列挙型そのものはクラスですし、そこで定義される case は全て、 そのクラスのインスタンスです。 これは、列挙型で定義される case は有効なオブジェクトであり、 型チェックを含む、オブジェクトが使えるあらゆる場所で使えるということです。

使用例

ルート バインディング

/app/Enums/Fruit.phpを作成します。

<?php
   namespace App\Enums;

   enum Fruit: string {
   case APPLE = '1';
   case BANANA = '2';
   case CHERRY = '3';

      public function label(): string
      {
          return match($this) {
              Fruit::APPLE => 'リンゴ',
              Fruit::BANANA => 'バナナ',
              Fruit::CHERRY => 'チェリー',
          };
      }
  }

/routes/web.phpに下記を追記します。

<?php
    Route::get('/fruilt/{fruilt}', function(\App\Enums\Fruit $fruilt) {
        dd($fruilt->name, $fruilt->value, $fruilt->label());
    });

/fruilt/1にアクセスすると下記の画面が表示されます。

/fruilt/4のように、存在しない値の場合404が返されます。

ちなみに、enumをint型にしたところ「Target [App\Enums\Fruit] is not instantiable」とエラーが表示されました。

balde上で呼び出す

 <div>
    @foreach(\App\Enums\Fruit::cases() as $value)
    <div>
        <div>name:{{$value->name}}</div>
        <div>value:{{$value->value}}</div>
    </div>
    @endforeach
</div>

下記の画面が表示されます。

cases()で下記のように値が取れます。

<?php
// cases()の中身
array:3 [
  0 => App\Enums\Fruit {
    name: "APPLE"
    value: "1"
  }
  1 => App\Enums\Fruit {
    name: "BANANA"
    value: "2"
  }
  2 => App\Enums\Fruit {
    name: "CHERRY"
    value: "3"
  }
]

configやDB上で値を管理することもあると思いますが、Enumを使って管理することもできますね。

controllerのグループ化

コントローラーをグループ化して、web.phpに定義できるようになりました。 Laravel8とLaravel9の書き方の違いを比較します。

/routes/web.php
Laravel8

<?php
    Route::get('/user', [App\Http\Controllers\UserController::class, 'index'])->name('user.index');
    Route::get('/user/create', [App\Http\Controllers\UserController::class, 'create'])->name('user.create');
    Route::get('/user/update', [App\Http\Controllers\UserController::class, 'update'])->name('user.update');
    Route::get('/user/delete', [App\Http\Controllers\UserController::class, 'delete'])->name('user.delete');

Laravel9

<?php
    Route::controller(App\Http\Controllers\UserController::class)->group(function () {
    Route::get('/user', 'index')->name('user.index');
    Route::get('/user/create', 'create')->name('user.create');
    Route::get('/user/update', 'update')->name('user.update');
    Route::get('/user/delete', 'delete')->name('user.delete');
    });

コントローラー名が省略できるので、見た目にもスッキリした状態になりました。

@checkedディレクティブ

blade上でチェックボックスの判定がシンプルに書けるようになりました。

Laravel8

<input name="agree" type="radio" @if(old('agree', $input->agree)) checked @endif />

Laravel9

<input name="agree" type="radio" @checked(old('agree', $input->agree)) />

@ selectedディレクティブ

blade上でセレクトボックスの判定がシンプルに書けるようになりました。
Laravel8

@foreach ($array as $value)
    <option value="{{ $value }}" @if(old('pref', $input->pref) == $value) selected @endif>
         {{ $value }}
     </option>
@endforeach

Laravel9

@foreach ($array as $value)
    <option value="{{ $value }}" @selected(old('pref', $input->pref) == $value)>
         {{ $value }}
     </option>
@endforeach

まとめ

すぐにでも案件に取り入られそうな新機能を試してみました。
@checkedや@selectedなどはすぐに取り込めそうですね。
便利な機能は取り入れられるよう、他にも便利な機能がないか勉強したいと思います!!