#影響の大きい変更点
#影響の中程度の変更点
#影響の小さい変更点
#9.x から 10.0 へのアップグレード
#推定アップグレード時間:10分
可能な限りすべての破壊的変更をドキュメント化しようとしています。ただし、これらの破壊的変更の一部はフレームワークのあまり使われない部分にあるため、実際にアプリケーションに影響するのは一部だけかもしれません。時間を節約したい場合は、Laravel Shift を使ってアプリケーションのアップグレードを自動化できます。
#依存関係の更新
影響の可能性:高
#PHP 8.1.0 が必須
Laravel は PHP 8.1.0 以上を必須とします。
#Composer 2.2.0 が必須
Laravel は Composer 2.2.0 以上を必須とします。
#Composer 依存関係
アプリケーションの composer.json ファイルで以下の依存関係を更新してください:
laravel/frameworkを^10.0にlaravel/sanctumを^3.2にdoctrine/dbalを^3.0にspatie/laravel-ignitionを^2.0にlaravel/passportを^11.0に (アップグレードガイド)laravel/uiを^4.0に
Sanctum 2.x から 3.x にアップグレードする場合は、Sanctum アップグレードガイド を参照してください。
さらに、PHPUnit 10 を使いたい場合は、アプリケーションの phpunit.xml 設定ファイルの <coverage> セクションから processUncoveredFiles 属性を削除してください。その後、アプリケーションの composer.json ファイルで以下の依存関係を更新してください:
nunomaduro/collisionを^7.0にphpunit/phpunitを^10.0に
最後に、アプリケーションで使用している他のサードパーティパッケージを確認し、Laravel 10 をサポートする適切なバージョンを使っているか検証してください。
#minimum-stability
アプリケーションの composer.json ファイル内の minimum-stability 設定を stable に更新してください。あるいは、minimum-stability のデフォルト値が stable であるため、この設定をアプリケーションの composer.json ファイルから削除しても問題ありません:
"minimum-stability": "stable",
#アプリケーション
#パブリックパスのバインディング
影響の可能性:低
アプリケーションがコンテナに path.public をバインドしてパブリックパスをカスタマイズしている場合は、代わりに Illuminate\Foundation\Application オブジェクトの usePublicPath メソッドを呼び出すようコードを更新してください:
app()->usePublicPath(__DIR__.'/public');
#認可
#registerPolicies メソッド
影響の可能性:低
AuthServiceProvider の registerPolicies メソッドはフレームワークによって自動的に呼び出されるようになりました。そのため、アプリケーションの AuthServiceProvider の boot メソッドからこの呼び出しを削除できます。
#キャッシュ
#Redis キャッシュタグ
影響の可能性:中
Cache::tags() の使用は Memcached を使うアプリケーションにのみ推奨されます。Redis をキャッシュドライバーに使っている場合は、Memcached に移行するか、Laravel 12.30.0 へのアップグレードを検討してください。
#データベース
#データベース式
影響の可能性:中
Laravel 10.x では、データベースの「式」(通常は DB::raw で生成)を将来的な機能拡張のために書き換えました。特に、式の生文字列は getValue(Grammar $grammar) メソッドで取得する必要があります。(string) キャストで文字列化することはサポートされなくなりました。
通常、これはエンドユーザーのアプリケーションには影響しません。しかし、もしアプリケーションが手動でデータベース式を (string) でキャストしたり、直接 __toString メソッドを呼び出している場合は、代わりに getValue メソッドを呼び出すようコードを更新してください:
use Illuminate\Support\Facades\DB;
$expression = DB::raw('select 1');
$string = $expression->getValue(DB::connection()->getQueryGrammar());
#クエリ例外のコンストラクタ
影響の可能性:非常に低い
Illuminate\Database\QueryException のコンストラクタは、第一引数に文字列の接続名を受け取れるようになりました。アプリケーションでこの例外を手動でスローしている場合は、コードを調整してください。
#ULID カラム
影響の可能性:低
マイグレーションで引数なしで ulid メソッドを呼び出すと、カラム名は ulid になります。以前の Laravel では引数なしで呼び出すと誤って uuid という名前のカラムが作成されていました:
$table->ulid();
ulid メソッドを呼び出す際にカラム名を明示的に指定したい場合は、カラム名を引数として渡せます:
$table->ulid('ulid');
#Eloquent
#モデルの "Dates" プロパティ
影響の可能性:中
Eloquent モデルの非推奨だった $dates プロパティは削除されました。代わりに $casts プロパティを使ってください:
protected $casts = [
'deployed_at' => 'datetime',
];
#ローカリゼーション
#言語ディレクトリ
影響の可能性:なし
既存のアプリケーションには影響しませんが、Laravel アプリケーションのスケルトンにはデフォルトで lang ディレクトリが含まれなくなりました。新規アプリケーションでは、lang:publish Artisan コマンドで公開できます:
php artisan lang:publish
#ロギング
#Monolog 3
影響の可能性:中
Laravel の Monolog 依存関係が Monolog 3.x に更新されました。アプリケーションで直接 Monolog を操作している場合は、Monolog のアップグレードガイドを確認してください。
BugSnag や Rollbar などのサードパーティロギングサービスを使っている場合は、Monolog 3.x と Laravel 10.x をサポートするバージョンにアップグレードする必要があるかもしれません。
#キュー
#Bus::dispatchNow メソッド
影響の可能性:低
非推奨だった Bus::dispatchNow と dispatch_now メソッドは削除されました。代わりに Bus::dispatchSync と dispatch_sync メソッドを使ってください。
#dispatch() ヘルパーの戻り値
影響の可能性:低
Illuminate\Contracts\Queue を実装していないクラスを dispatch で呼び出すと、以前はそのクラスの handle メソッドの結果を返していましたが、今後は Illuminate\Foundation\Bus\PendingBatch インスタンスを返します。以前の挙動を再現したい場合は dispatch_sync() を使ってください。
#ルーティング
#ミドルウェアのエイリアス
影響の可能性:任意
新規 Laravel アプリケーションでは、App\Http\Kernel クラスの $routeMiddleware プロパティが目的をより明確にするために $middlewareAliases に名前が変更されました。既存アプリケーションでも名前を変更して構いませんが、必須ではありません。
#レートリミッターの戻り値
影響の可能性:低
RateLimiter::attempt メソッドを呼び出すと、提供されたクロージャの戻り値がメソッドの戻り値になります。何も返さないか null を返した場合は、attempt メソッドは true を返します:
$value = RateLimiter::attempt('key', 10, fn () => ['example'], 1);
$value; // ['example']
#Redirect::home メソッド
影響の可能性:非常に低い
非推奨だった Redirect::home メソッドは削除されました。代わりに明示的に名前付きルートへリダイレクトしてください:
return Redirect::route('home');
#テスト
#サービスのモック
影響の可能性:中
非推奨だった MocksApplicationServices トレイトはフレームワークから削除されました。このトレイトは expectsEvents、expectsJobs、expectsNotifications などのテストメソッドを提供していました。
これらのメソッドを使っている場合は、それぞれ Event::fake、Bus::fake、Notification::fake に移行することを推奨します。モックの詳細は、モックしたいコンポーネントのドキュメントで確認できます。
#バリデーション
#クロージャバリデーションルールのメッセージ
影響の可能性:非常に低い
クロージャベースのカスタムバリデーションルールで $fail コールバックを複数回呼び出すと、メッセージが上書きされるのではなく配列に追加されるようになりました。通常はアプリケーションに影響しません。
さらに、$fail コールバックはオブジェクトを返すようになりました。以前にバリデーションクロージャの戻り値の型を指定していた場合は、型ヒントを更新する必要があるかもしれません。
public function rules()
{
'name' => [
function ($attribute, $value, $fail) {
$fail('validation.translation.key')->translate();
},
],
}
#バリデーションメッセージとクロージャルール
影響の可能性:非常に低い
以前は、クロージャベースのバリデーションルールに注入される $fail コールバックに配列を渡すことで異なるキーに失敗メッセージを割り当てられましたが、今後はキーを第一引数、失敗メッセージを第二引数として渡す必要があります:
Validator::make([
'foo' => 'string',
'bar' => [function ($attribute, $value, $fail) {
$fail('foo', 'Something went wrong!');
}],
]);
#フォームリクエストの After メソッド
影響の可能性:非常に低い
フォームリクエスト内では、after メソッドは現在 Laravel によって予約されています。フォームリクエストが after メソッドを定義している場合は、そのメソッド名を変更するか、Laravel のフォームリクエストに追加された新しい「検証後」機能を利用するように修正してください。
#その他
laravel/laravel の GitHub リポジトリ の変更も確認することを推奨します。多くの変更は必須ではありませんが、これらのファイルをアプリケーションと同期させたい場合があります。このアップグレードガイドで扱う変更もありますが、設定ファイルやコメントの変更などは含まれません。
GitHub 比較ツール で簡単に変更点を確認し、重要な更新だけを選べます。ただし、多くの変更は PHP ネイティブ型の採用によるもので、これらは後方互換性があり、Laravel 10 への移行時に採用するかは任意です。