こんにちは、かつコーチです。
2022年2月にLarave9がリリースされました。
Laravel 8からLaravel 9へのアップデートでは、多くの新機能、改良、
そしてパフォーマンスの向上が導入されました。
Laravel 9は、LTS(Long Term Support)リリースとして、
5年間のバグ修正とセキュリティアップデートが保証されるバージョンであり、
プロジェクトに安定性をもたらします。
以下に、Laravel 9で追加された主要な機能や変更点、Laravel 8までとの違いを詳しく説明します。
PHP 8.xを必要とする
Laravel 9では、PHP 8.0以上が必須となりました。
これにより、PHP 8.xの新機能やパフォーマンス向上をフルに活用できるようになります。
Laravel 9のコアライブラリは、PHP 8.xの機能である「ネームドアーギュメント」
「属性(アノテーション)」「マッチ式」などを活用しています。
変更点:
- Laravel 9の使用にはPHP 8.0以上が必要。
- PHP 8.xの新機能や型ヒントを利用して、コードのパフォーマンスや可読性が向上。
public function exampleFunction(int $id, string $name = 'Default'): void
{
// ネームドアーギュメントや型ヒントが利用可能
}
ルーティング: コントローラーの full メソッド
Laravel 9では、ルート定義において新しいfull
メソッドが追加され、
ルーティングの際に完全なURL(クエリパラメータを含む)を取得できるようになりました。
これにより、特定のリクエストのフルパスを簡単に取得して処理できるようになりました。
変更点:
- ルーティングに
full
メソッドが追加され、クエリパラメータを含む完全なURLを取得可能。
$url = $request->fullUrl(); // 完全なURLを取得
コントローラーのルート定義のリファクタリング
Laravel 9では、ルート定義が大幅にリファクタリングされ、
コードの読みやすさと管理のしやすさが向上しました。
新しいRoute::controller()
メソッドを使用して、
コントローラーのメソッドに対するルートをまとめて定義できるようになりました。
変更点:
Route::controller()
メソッドが導入され、コントローラーのルート定義が簡潔になった。- コントローラー内のルートをまとめて定義可能。
Route::controller(UserController::class)->group(function () {
Route::get('/users', 'index');
Route::post('/users', 'store');
});
匿名スタブマイグレーション
Laravel 9では、従来のマイグレーションクラスに名前空間が必要だったのに対し、
「匿名スタブマイグレーション」が導入されました。
これにより、複数のマイグレーションクラスが同じ名前空間に存在する際に発生していた
名前衝突の問題が解消されます。
変更点:
- 名前空間のない匿名マイグレーションがサポートされ、名前衝突の問題を防止。
- デフォルトで新しいマイグレーションは匿名クラスとして生成される。
// Laravel 9から、マイグレーションは匿名クラスを使用
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
});
}
強化されたバインディングの依存解決
Laravel 9では、ルートパラメータに対する依存関係の解決が強化されました。
これにより、ルートモデルバインディングが改良され、
Eloquentモデルのルックアップや依存関係が自動的に解決されます。
変更点:
- 依存解決のパフォーマンスと正確性が向上。
- Eloquentモデルの自動バインディングが強化され、ルート処理がスムーズに。
Route::get('/users/{user}', function (User $user) {
return $user;
});
Eloquent Accessors / Mutatorsの改善
Laravel 9では、Eloquentモデルのアクセサやミューテータの定義が簡単になり、
柔軟性が向上しました。
get
やset
のプレフィックスを使用するのではなく、
PHP 8.xの属性やタイプヒンティングを使用して定義できるようになりました。
変更点:
- アクセサとミューテータがリファクタリングされ、より直感的な書き方が可能に。
class User extends Model
{
// 新しいアクセサの定義方法
public function getNameAttribute(): Attribute
{
return Attribute::make(
get: fn ($value) => ucfirst($value),
set: fn ($value) => strtolower($value),
);
}
}
バッチジョブの改良
Laravel 9では、バッチジョブの進行状況の追跡やキャンセル、失敗時の処理がさらに強化されました。
これにより、大規模なバッチ処理や複数のジョブを一括管理する際の操作性が向上しています。
変更点:
- バッチジョブの進行状況がさらに詳細に管理可能。
- 失敗時の処理やキャンセル操作が強化。
Bus::batch([
new ProcessPodcast,
new ReleasePodcast,
])->then(function (Batch $batch) {
// 成功時の処理
})->catch(function (Batch $batch, Throwable $e) {
// 失敗時の処理
})->dispatch();
スケジュールリストコマンドの追加
Laravel 9では、スケジュールされているタスクのリストを表示する
新しいschedule:list
コマンドが導入されました。
このコマンドを使用すると、登録されているスケジュールジョブを確認でき、
ジョブの管理が容易になります。
変更点:
schedule:list
コマンドが追加され、スケジュールジョブを簡単に確認できる。
php artisan schedule:list
Symfony Mailerの導入
Laravel 9では、メール送信機能において、従来のSwiftMailerの代わりに
Symfony Mailerが使用されるようになりました。
これにより、パフォーマンスや機能が向上し、今後のメンテナンス性が改善されます。
変更点:
- Symfony Mailerがデフォルトのメール送信ライブラリに。
- SwiftMailerからの移行に伴い、メール送信の安定性が向上。
10. 最小依存バージョンの更新
Laravel 9では、他の主要なライブラリや
フレームワーク(Symfony、Flysystem、Guzzleなど)の最小バージョンがアップデートされました。
これにより、依存関係のパフォーマンスやセキュリティが向上しています。
変更点:
- SymfonyやFlysystemなどのパッケージのバージョンが最新に更新され、性能とセキュリティが強化。
11. その他の改善点
- Flysystem 3.xサポート: ファイルストレージの処理が向上し、ストレージのパフォーマンスや柔軟性が向上。
- バグ修正とパフォーマンスの向上: Laravel 9では、既存機能のバグ修正やパフォーマンスの最適化が行われています。
まとめ
Laravel 9では、主に以下の点が強化されました:
- PHP 8.0以上への対応による、最新技術の活用。
- 匿名スタブマイグレーションやEloquent Accessorsの改善により、開発の効率化と管理のしやすさが向上。
- Symfony Mailerの導入やバッチジョブの強化などで、パフォーマンスと信頼性が向上。
- 開発者にとって、最新のツールや技術を取り入れた安定したLTSリリースとして、長期的なプロジェクトにも適したバージョン。
Laravel 9は、最新のPHP機能を活用しつつ、パフォーマスが大幅に向上しました。