こんにちは!ドイです。
今回は、最近の案件で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などはすぐに取り込めそうですね。
便利な機能は取り入れられるよう、他にも便利な機能がないか勉強したいと思います!!