前回に引き続き今回はLaravel8系の新機能や変更点について振り返ります。
前回の記事は以下です。
Laravel9は長期サポート(LTS)リリースになるため、多くの新機能追加や改善が行われています。
主要な新機能・変更点
Laravel9の位置づけと要件
Laravel9はLaravel8以降、初めてのLTS(Long Term Support)バージョンとなりました。
LTSバージョンは長期的なサポート期間を持つため、安定した基盤での開発・運用を希望する場合に有効な選択肢になります。
また、Laravel9はベースとなるSymfonyコンポーネントが6系へ移行したことや、PHP8以上が必須要件となったことが大きなポイントです。
これによって、最新のPHP言語機能やパフォーマンス向上が期待できる環境が整えられています。
PHP8が必須になった理由
Laravel9ではPHP8以上が必須です。
PHP8は、ユニオン型、NULLセーフ演算子、JITコンパイラなど、開発効率やパフォーマンスを向上させる新機能が追加されています。
これにより、Laravel9では最新PHPの恩恵を受け、開発者はよりスムーズなコーディング体験を得ることができます。
一方で、PHP7系環境で動かしていたプロジェクトをLaravel9へ上げる場合は、サーバやCI環境のPHPバージョンアップが必要になる点に注意が必要です。
新しいメール送信ライブラリへの移行
Laravel8まではSwift Mailerがメール送信ライブラリとして利用されていましたが、Laravel9ではSymfony Mailerへ移行されました。
Symfony Mailerはよりメンテナンスが行き届いたライブラリで、今後も長期的なサポートが期待できます。
開発者側で特別な対応をしなくても、通常はMailファサードやMailableクラスを通じて、これまで通りにメール送信が行えます。
そのため、メール周りのコードは大きく変える必要はありませんが、内部実装がより安定し、将来的な拡張にも備えやすくなりました。
ルーティング関連の改善
Laravel9ではルーティング周りも改善が加えられました。
特にroute:list
コマンドが見やすくなり、ルートの確認やドキュメンテーションを行う際に便利です。
ルート情報が整然と表示されるため、新人メンバーやレビュー時にも理解しやすくなります。
また、ロードマップ的な変更として、基盤となるSymfonyコンポーネントの更新により、内部的な処理速度や保守性の向上が期待できます。
Eloquentアクセサ・ミューテタ記法の改善
Laravel9ではEloquentモデルのアクセサ(属性取得時の加工)やミューテタ(属性保存時の加工)の記法がシンプルかつわかりやすくなっています。
従来はgetXxxAttribute
やsetXxxAttribute
というメソッド名ベースで定義していましたが、Laravel9ではcast
や新しいインターフェースを活用したより明確な記述が可能です。
これにより、モデル属性の扱いが直感的になります。
アクセサ・ミューテタの簡単な例(Laravel9)
namespace App\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// タイトル属性を常に先頭大文字で扱う例
protected function title(): Attribute
{
return Attribute::make(
get: fn($value) => ucfirst($value),
set: fn($value) => strtolower($value)
);
}
}
// 利用例
$post = Post::create(['title' => 'hello world']);
echo $post->title;
// 出力結果:"Hello world"
// DBには"hello world"で保存されるが、取得時には先頭大文字で返される
このように、Attribute::make
でget
とset
を明示的に定義でき、コードがわかりやすく整理されます。
Laravel8でも同様のことは可能でしたが、Laravel9ではこれが公式にわかりやすい形で提供されているため、積極的に利用することでモデルの属性操作がシンプルになります。
Query Builderインターフェースの明確化
Laravel9ではQuery Builderにタイプヒントが付けられ、IDE補完がより充実し、開発者がクエリを書く際の生産性が向上します。
これにより、SQLクエリビルダーを組み立てるときにエディタで補完が効きやすくなり、間違いを減らせます。
Query BuilderでのIDE補完例
use Illuminate\Support\Facades\DB;
$users = DB::table('users')
->where('active', true)
->orderBy('name')
->get();
// IDE上でwhereやorderBy、getなどのメソッドが補完され、引数チェックが容易に
この改善はコード品質の向上に繋がり、特に慣れないメンバーが参加するプロジェクトでは効果的です。
Flysystem 3.xへのアップデート
ストレージ抽象化層であるFlysystemが3.x系に更新されています。
これにより、ファイル操作の安定性やパフォーマンスが向上し、外部ストレージ(S3やFTPなど)との連携が円滑になります。
開発者としては特別な対応なしに恩恵を受けられる場合が多いため、特に大規模なファイルストレージを扱う際に効果的です。
上記以外での主な新機能・変更点
Symfony 6 コンポーネント
- Symfony 6 をベースとしたコンポーネントを採用。
新しいデフォルトルートファイル
routes/web.php
に全ルートが集約され、API ルートやウェブルートの管理が簡略化。
Eloquent: Accessor & Mutator の改良
- カスタムアクセサとミューテータが新しい統一 API を利用可能。
コントローラのルートグループ構文
->controller()
メソッドでルートグループ内の共通コントローラを簡潔に定義。
新しいバッチジョブ機能
- バッチジョブでの詳細な進捗管理とエラー処理が可能。
フルテキストインデックス/検索
- MySQL と PostgreSQL のフルテキスト検索をサポート。
Scout データベースエンジン
- Laravel Scout にシンプルなデータベースエンジンが追加。
Bootstrap 5 対応
- Laravel Breeze が Bootstrap 5 に対応。
テストカバレッジレポート
- PHPUnit でテストカバレッジレポートを生成可能。
Parallel Testing の改良
- 並列テスト実行のパフォーマンスが向上。
Laravel Breeze の Inertia.js 対応
- Laravel Breeze が Inertia.js と Tailwind CSS に対応。
HTTP Client: RetryWhen メソッド
- HTTP クライアントで、特定の条件でリトライを行う
retryWhen
メソッドが追加。
New Helper Functions
str()
,to_route()
などの新しいヘルパー関数が追加。
バグ修正とパフォーマンスの改善
- フレームワーク全体の最適化と安定性向上。
Blade コンポーネントでのデフォルト引数
- Blade コンポーネントにデフォルト引数を設定可能。
Route: is
メソッドの追加
- 現在のルート名が一致するかを判定する
is
メソッドが追加。
Job クラスの名前空間変更
App\Jobs
ディレクトリ構造がデフォルトに。
Minimum Security Improvements
- セキュリティ強化に伴う調整。
Laravel 8とLaravel 9の違い
Laravel9はLaravel8の改良版として、LTS対応、PHP8対応、Symfony6ベースへの移行、メール送信ライブラリの更新、Eloquentアクセサ・ミューテタの改善、Query Builderのインターフェース強化など、多くの変更が加えられています。
まとめ
Laravel9ではLTS版ということで多くの新機能や改善が行われました。
一番大きいのはPHP8対応だと思います。
これによりコンストラクタプロパティプロモーション、名前付き引数、ヌルセーフ演算子など便利な機能が利用できるようになったことは影響が大きかったと思います。