アップグレードガイド (Upgrade Guide)
大きな影響を与える変更 (High Impact Changes)
中程度の影響のある変更 (Medium Impact Changes)
影響の少ない変更 (Low Impact Changes)
10.x から 11.0 へのアップグレード (Upgrading To 11.0 From 10.x)
アップグレードの推定時間: 15 分
私たちは、考えられるすべての重大な変更を文書化するよう努めます。これらの重大な変更の一部はフレームワークのあいまいな部分にあるため、実際にアプリケーションに影響を与える可能性があるのは、これらの変更の一部だけです。時間を節約したいですか? Laravelシフト を使用すると、アプリケーションのアップグレードを自動化できます。
依存関係の更新
影響の可能性: 高
PHP 8.2.0が必要
Laravel には PHP 8.2.0 以降が必要になりました。
カール 7.34.0 が必要
Laravel の HTTP クライアントには、curl 7.34.0 以降が必要になりました。
Composer の依存関係
アプリケーションの composer.json ファイル内の次の依存関係を更新する必要があります。
laravel/framework~^11.0nunomaduro/collision~^8.1laravel/breeze~^2.0(インストールされている場合)laravel/cashier~^15.0(インストールされている場合)laravel/dusk~^8.0(インストールされている場合)laravel/jetstream~^5.0(インストールされている場合)laravel/octane~^2.3(インストールされている場合)laravel/passport~^12.0(インストールされている場合)laravel/sanctum~^4.0(インストールされている場合)laravel/scout~^10.0(インストールされている場合)laravel/spark-stripe~^5.0(インストールされている場合)laravel/telescope~^5.0(インストールされている場合)livewire/livewire~^3.4(インストールされている場合)inertiajs/inertia-laravel~^1.0(インストールされている場合)
アプリケーションが Laravel Cashier Stripe、Passport、Sanctum、Spark Stripe、または Telescope を使用している場合は、それらの移行をアプリケーションに公開する必要があります。 Cashier Stripe、Passport、Sanctum、Spark Stripe、および Telescope は、独自の移行ディレクトリから移行を自動的にロードしなくなりました。したがって、次のコマンドを実行して、移行をアプリケーションに公開する必要があります。
php artisan vendor:publish --tag=cashier-migrations
php artisan vendor:publish --tag=passport-migrations
php artisan vendor:publish --tag=sanctum-migrations
php artisan vendor:publish --tag=spark-migrations
php artisan vendor:publish --tag=telescope-migrations
さらに、これらの各パッケージのアップグレード ガイドを参照して、追加の重大な変更を確認してください。
Laravel インストーラーを手動でインストールした場合は、Composer 経由でインストーラーを更新する必要があります。
composer global require laravel/installer:^5.6
最後に、Laravel はこのパッケージに依存しなくなったため、以前にアプリケーションに doctrine/dbal Composer 依存関係を追加していた場合は、それを削除できます。
アプリケーションの構造
Laravel 11 では、デフォルトのファイルが減った新しいデフォルトのアプリケーション構造が導入されています。つまり、新しい Laravel アプリケーションには、含まれるサービスプロバイダ、ミドルウェア、および構成ファイルが少なくなります。
ただし、Laravel 11 は Laravel 10 アプリケーション構造もサポートするように慎重に調整されているため、Laravel 10 アプリケーションを Laravel 11 にアップグレードする際にアプリケーション構造を移行しようとすることはお勧めしません。
認証
パスワードの再ハッシュ
影響の可能性: 低い
Laravel 11は、パスワードが最後にハッシュされてからハッシュアルゴリズムの「作業係数」が更新されている場合、認証中にユーザーのパスワードを自動的に再ハッシュします。
通常、これによってアプリケーションが中断されることはありません。ただし、User モデルの「パスワード」フィールドに password 以外の名前がある場合は、モデルの authPasswordName プロパティを使用してフィールドの名前を指定する必要があります。
protected $authPasswordName = 'custom_password_field';
あるいは、アプリケーションの config/hashing.php 構成ファイルに rehash_on_login オプションを追加して、パスワードの再ハッシュを無効にすることもできます。
'rehash_on_login' => false,
UserProvider 契約
影響の可能性: 低い
Illuminate\Contracts\Auth\UserProvider コントラクトは、新しい rehashPasswordIfRequired メソッドを受け取りました。このメソッドは、アプリケーションのハッシュ アルゴリズムの作業係数が変更されたときに、ユーザーのパスワードを再ハッシュしてストレージに保存する役割を果たします。
アプリケーションまたはパッケージがこのインターフェイスを実装するクラスを定義している場合は、新しい rehashPasswordIfRequired メソッドを実装に追加する必要があります。参照実装は、Illuminate\Auth\EloquentUserProvider クラス内にあります。
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false);
Authenticatable 契約
影響の可能性: 低い
Illuminate\Contracts\Auth\Authenticatable コントラクトは、新しい getAuthPasswordName メソッドを受け取りました。このメソッドは、認証可能なエンティティのパスワード列の名前を返す役割を果たします。
アプリケーションまたはパッケージがこのインターフェイスを実装するクラスを定義している場合は、新しい getAuthPasswordName メソッドを実装に追加する必要があります。
public function getAuthPasswordName()
{
return 'password';
}
Laravel に含まれるデフォルトの User モデルは、メソッドが Illuminate\Auth\Authenticatable トレイト内に含まれているため、このメソッドを自動的に受け取ります。
AuthenticationException クラス
影響の可能性: 非常に低い
Illuminate\Auth\AuthenticationException クラスの redirectTo メソッドには、最初の引数として Illuminate\Http\Request インスタンスが必要になりました。この例外を手動でキャッチして redirectTo メソッドを呼び出している場合は、それに応じてコードを更新する必要があります。
if ($e instanceof AuthenticationException) {
$path = $e->redirectTo($request);
}
登録時のメール認証通知
影響の可能性: 非常に低い
SendEmailVerificationNotification リスナは、アプリケーションの EventServiceProvider によってまだ登録されていない場合、Registered イベントに自動的に登録されるようになりました。アプリケーションの EventServiceProvider がこのリスナを登録せず、Laravel に自動的に登録されたくない場合は、アプリケーションの EventServiceProvider で空の configureEmailVerification メソッドを定義する必要があります。
protected function configureEmailVerification()
{
// ...
}
キャッシュ
キャッシュキープレフィックス
影響の可能性: 非常に低い
以前は、キャッシュキープレフィックスが DynamoDB、Memcached、または Redis キャッシュストアに定義されている場合、Laravel はプレフィックスに : を追加していました。 Laravel 11では、キャッシュキープレフィックスは:サフィックスを受け取りません。以前のプレフィックスの動作を維持したい場合は、キャッシュ キー プレフィックスに : サフィックスを手動で追加できます。
コレクション
Enumerable 契約
影響の可能性: 低い
Illuminate\Support\Enumerable コントラクトの dump メソッドが更新され、可変個の ...$args 引数を受け入れるようになりました。このインターフェースを実装している場合は、それに応じて実装を更新する必要があります。
public function dump(...$args);
データベース
SQLite 3.26.0+
影響の可能性: 高
アプリケーションが SQLite データベースを利用している場合は、SQLite 3.26.0 以降が必要です。
Eloquent モデル casts メソッド
影響の可能性: 低い
基本 Eloquent モデル クラスは、属性キャストの定義をサポートするために、casts メソッドを定義するようになりました。アプリケーションのモデルの 1 つが casts 関係を定義している場合、基本 Eloquent モデル クラスに現在存在する casts メソッドと競合する可能性があります。
列の変更
影響の可能性: 高
列を変更する場合、変更後に列定義に保持したいすべての修飾子を明示的に含める必要があります。欠落している属性は削除されます。たとえば、unsigned、default、および comment 属性を保持するには、これらの属性が以前の移行によって列に割り当てられていたとしても、列を変更するときに各修飾子を明示的に呼び出す必要があります。
たとえば、unsigned、default、および comment 属性を持つ votes 列を作成する移行があると想像してください。
Schema::create('users', function (Blueprint $table) {
$table->integer('votes')->unsigned()->default(1)->comment('The vote count');
});
後で、列を nullable に変更する移行を作成します。
Schema::table('users', function (Blueprint $table) {
$table->integer('votes')->nullable()->change();
});
Laravel 10 では、この移行により列の unsigned、default、および comment 属性が保持されます。ただし、Laravel 11 では、以前に列に定義されていたすべての属性も移行に含める必要があります。それ以外の場合、それらはドロップされます。
Schema::table('users', function (Blueprint $table) {
$table->integer('votes')
->unsigned()
->default(1)
->comment('The vote count')
->nullable()
->change();
});
change メソッドは列のインデックスを変更しません。したがって、列を変更するときにインデックス修飾子を使用してインデックスを明示的に追加または削除できます。
// Add an index...
$table->bigIncrements('id')->primary()->change();
// Drop an index...
$table->char('postal_code', 10)->unique(false)->change();
列の既存の属性を保持するためにアプリケーション内の既存の「変更」移行をすべて更新したくない場合は、単純に 移行を潰す を実行します。
php artisan schema:dump
移行が中断されると、Laravel は保留中の移行を実行する前に、アプリケーションのスキーマ ファイルを使用してデータベースを「移行」します。
浮動小数点型
影響の可能性: 高
double および float 移行列タイプは、すべてのデータベースで一貫性があるように書き直されました。
double 列タイプは、標準 SQL 構文である合計桁数と桁数 (小数点以下の桁数) を持たない DOUBLE と同等の列を作成するようになりました。したがって、$total および $places の引数を削除できます。
$table->double('amount');
float 列タイプは、合計桁数と桁数 (小数点以下の桁数) を持たない FLOAT と同等の列を作成するようになりましたが、ストレージ サイズを 4 バイトの単精度列または 8 バイトの倍精度列として決定するオプションの $precision 仕様を使用します。したがって、データベースのドキュメントに従って、$total および $places の引数を削除し、オプションの $precision を希望の値に指定できます。
$table->float('amount', precision: 53);
unsignedDecimal、unsignedDouble、および unsignedFloat メソッドは、これらの列タイプの unsigned 修飾子が MySQL で非推奨になり、他のデータベース システムでは標準化されなかったため、削除されました。ただし、これらの列タイプに対して非推奨の unsigned 属性を引き続き使用したい場合は、unsigned メソッドを列の定義に連鎖させることができます。
$table->decimal('amount', total: 8, places: 2)->unsigned();
$table->double('amount')->unsigned();
$table->float('amount', precision: 53)->unsigned();
専用の MariaDB ドライバ
影響の可能性: 非常に低い
MariaDB データベースに接続するときに常に MySQL ドライバを使用するのではなく、Laravel 11 では MariaDB 専用のデータベース ドライバを追加します。
アプリケーションが MariaDB データベースに接続する場合、接続構成を新しい mariadb ドライバに更新すると、将来的に MariaDB 固有の機能を利用できるようになります。
'driver' => 'mariadb',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
// ...
現在、新しい MariaDB ドライバは、1 つの例外を除いて現在の MySQL ドライバと同様に動作します。それは、uuid スキーマ ビルダ メソッドが、char(36) 列の代わりにネイティブ UUID 列を作成することです。
既存の移行で uuid スキーマ ビルダ メソッドを利用し、新しい mariadb データベース ドライバの使用を選択した場合は、破壊的な変更や予期しない動作を避けるために、移行による uuid メソッドの呼び出しを char に更新する必要があります。
Schema::table('users', function (Blueprint $table) {
$table->char('uuid', 36);
// ...
});
空間タイプ
影響の可能性: 低い
データベース移行の空間列タイプは、すべてのデータベースで一貫性を保つように書き直されました。したがって、point、lineString、polygon、geometryCollection、multiPoint、multiLineString、multiPolygon、および multiPolygonZ メソッドを移行から削除し、geometry または代わりに geography メソッド:
$table->geometry('shapes');
$table->geography('coordinates');
MySQL、MariaDB、および PostgreSQL の列に格納される値の型または空間参照系識別子を明示的に制限するには、subtype および srid をメソッドに渡すことができます。
$table->geometry('dimension', subtype: 'polygon', srid: 0);
$table->geography('latitude', subtype: 'point', srid: 4326);
これに応じて、PostgreSQL 文法の isGeometry 列修飾子と projection 列修飾子が削除されました。
ドクトリン DBAL の削除
影響の可能性: 低い
以下の Doctrine DBAL 関連のクラスとメソッドのリストは削除されました。 Laravel はこのパッケージに依存しなくなり、以前はカスタム型が必要だったさまざまな列型を適切に作成および変更するために、カスタム Doctrines 型を登録する必要がなくなりました。
Illuminate\Database\Schema\Builder::$alwaysUsesNativeSchemaOperationsIfPossibleクラスのプロパティIlluminate\Database\Schema\Builder::useNativeSchemaOperationsIfPossible()メソッドIlluminate\Database\Connection::usingNativeSchemaOperations()メソッドIlluminate\Database\Connection::isDoctrineAvailable()メソッドIlluminate\Database\Connection::getDoctrineConnection()メソッドIlluminate\Database\Connection::getDoctrineSchemaManager()メソッドIlluminate\Database\Connection::getDoctrineColumn()メソッドIlluminate\Database\Connection::registerDoctrineType()メソッドIlluminate\Database\DatabaseManager::registerDoctrineType()メソッドIlluminate\Database\PDOディレクトリIlluminate\Database\DBAL\TimestampTypeクラスIlluminate\Database\Schema\Grammars\ChangeColumnクラスIlluminate\Database\Schema\Grammars\RenameColumnクラスIlluminate\Database\Schema\Grammars\Grammar::getDoctrineTableDiff()メソッド
さらに、アプリケーションの database 設定ファイルで dbal.types を介してカスタム Doctrine タイプを登録する必要はなくなりました。
以前に Doctrine DBAL を使用してデータベースとその関連テーブルを検査していた場合は、代わりに Laravel の新しいネイティブ スキーマ メソッド (Schema::getTables()、Schema::getColumns()、Schema::getIndexes()、Schema::getForeignKeys() など) を使用できます。
廃止されたスキーマメソッド
影響の可能性: 非常に低い
非推奨の Doctrine ベースの Schema::getAllTables()、Schema::getAllViews()、および Schema::getAllTypes() メソッドは削除され、新しい Laravel ネイティブ Schema::getTables()、Schema::getViews()、および Schema::getTypes() メソッドが採用されました。
PostgreSQL と SQL Server を使用する場合、新しいスキーマ メソッドはいずれも 3 部構成の参照 (database.schema.table など) を受け入れません。したがって、代わりに connection() を使用してデータベースを宣言する必要があります。
Schema::connection('database')->hasTable('schema.table');
スキーマ ビルダ getColumnType() メソッド
影響の可能性: 非常に低い
Schema::getColumnType() メソッドは、Doctrine DBAL の同等の型ではなく、常に指定された列の実際の型を返すようになりました。
データベース接続インターフェース
影響の可能性: 非常に低い
Illuminate\Database\ConnectionInterface インターフェイスは、新しい scalar メソッドを受け取りました。このインターフェースの独自の実装を定義している場合は、scalar メソッドを実装に追加する必要があります。
public function scalar($query, $bindings = [], $useReadPdo = true);
日付
カーボン3
影響の可能性: 中
Laravel 11 は、Carbon 2 と Carbon 3 の両方をサポートしています。Carbon は、Laravel とエコシステム全体のパッケージによって広く利用されている日付操作ライブラリです。 Carbon 3 にアップグレードする場合は、diffIn* メソッドが浮動小数点数を返すようになり、時間方向を示すために負の値を返す可能性があることに注意してください。これは、Carbon 2 からの大きな変更点です。これらの変更およびその他の変更の処理方法の詳細については、Carbon の 変更ログ および documentation を確認してください。
郵便
Mailer 契約
影響の可能性: 非常に低い
Illuminate\Contracts\Mail\Mailer コントラクトは、新しい sendNow メソッドを受け取りました。アプリケーションまたはパッケージがこのコントラクトを手動で実装している場合は、新しい sendNow メソッドを実装に追加する必要があります。
public function sendNow($mailable, array $data = [], $callback = null);
パッケージ
サービスプロバイダをアプリケーションに公開する
影響の可能性: 非常に低い
サービスプロバイダをアプリケーションの app/Providers ディレクトリに手動で公開し、アプリケーションの config/app.php 構成ファイルを手動で変更してサービスプロバイダを登録する Laravel パッケージを作成した場合は、新しい ServiceProvider::addProviderToBootstrapFile メソッドを利用するようにパッケージを更新する必要があります。
新しい Laravel 11 アプリケーションの config/app.php 構成ファイル内に providers 配列が存在しないため、addProviderToBootstrapFile メソッドは、公開したサービスプロバイダをアプリケーションの bootstrap/providers.php ファイルに自動的に追加します。
use Illuminate\Support\ServiceProvider;
ServiceProvider::addProviderToBootstrapFile(Provider::class);
キュー
BatchRepository インターフェイス
影響の可能性: 非常に低い
Illuminate\Bus\BatchRepository インターフェイスは、新しい rollBack メソッドを受け取りました。このインターフェイスを独自のパッケージまたはアプリケーション内に実装している場合は、このメソッドを実装に追加する必要があります。
public function rollBack();
データベーストランザクションの同期ジョブ
影響の可能性: 非常に低い
以前は、キュー接続の after_commit 構成オプションが true に設定されているか、ジョブで afterCommit メソッドが呼び出されたかに関係なく、同期ジョブ (sync キュー ドライバを使用するジョブ) がすぐに実行されました。
Laravel 11では、同期キュージョブはキュー接続またはジョブの「コミット後」設定を尊重するようになりました。
レート制限
1 秒あたりのレート制限
影響の可能性: 中
Laravel 11 は、分単位の粒度に制限されるのではなく、秒単位のレート制限をサポートします。この変更に関連して、注意が必要な重大な変更がさまざまに存在する可能性があります。
GlobalLimit クラス コンストラクターは、分の代わりに秒を受け入れるようになりました。このクラスは文書化されていないため、通常はアプリケーションでは使用されません。
new GlobalLimit($attempts, 2 * 60);
Limit クラス コンストラクターは、分の代わりに秒を受け入れるようになりました。このクラスの文書化された使用法はすべて、Limit::perMinute や Limit::perSecond などの静的コンストラクターに限定されています。ただし、このクラスを手動でインスタンス化する場合は、クラスのコンストラクターに秒を提供するようにアプリケーションを更新する必要があります。
new Limit($key, $attempts, 2 * 60);
Limit クラスの decayMinutes プロパティの名前が decaySeconds に変更され、分の代わりに秒が含まれるようになりました。
Illuminate\Queue\Middleware\ThrottlesExceptions クラス コンストラクターと Illuminate\Queue\Middleware\ThrottlesExceptionsWithRedis クラス コンストラクターは、分の代わりに秒を受け入れるようになりました。
new ThrottlesExceptions($attempts, 2 * 60);
new ThrottlesExceptionsWithRedis($attempts, 2 * 60);
CashierStripe
CashierStripe の更新
影響の可能性: 高
Laravel 11 は Cashier Stripe 14.x をサポートしなくなりました。したがって、アプリケーションの Laravel Cashier Stripe 依存関係を、composer.json ファイル内の ^15.0 に更新する必要があります。
Cashier Stripe 15.0 は、独自の移行ディレクトリから移行を自動的にロードしなくなりました。代わりに、次のコマンドを実行して、Cashier Stripe の移行をアプリケーションに公開する必要があります。
php artisan vendor:publish --tag=cashier-migrations
その他の重大な変更については、完全な Cashier Stripe アップグレード ガイド を確認してください。
スパーク(Stripe)
Spark Stripe の更新
影響の可能性: 高
Laravel 11 は Laravel Spark Stripe 4.x をサポートしなくなりました。したがって、アプリケーションの Laravel Spark Stripe 依存関係を、composer.json ファイル内の ^5.0 に更新する必要があります。
Spark Stripe 5.0 は、独自の移行ディレクトリから移行を自動的にロードしなくなりました。代わりに、次のコマンドを実行して、Spark Stripe の移行をアプリケーションに公開する必要があります。
php artisan vendor:publish --tag=spark-migrations
その他の重大な変更については、完全な Spark Stripe アップグレード ガイド を確認してください。
Passport
Passportの更新
影響の可能性: 高
Laravel 11 は Laravel Passport 11.x をサポートしなくなりました。したがって、アプリケーションの Laravel Passport 依存関係を composer.json ファイル内の ^12.0 に更新する必要があります。
Passport 12.0 は、独自の移行ディレクトリから移行を自動的にロードしなくなりました。代わりに、次のコマンドを実行して、Passport の移行をアプリケーションに公開する必要があります。
php artisan vendor:publish --tag=passport-migrations
さらに、パスワード付与タイプはデフォルトでは無効になっています。これを有効にするには、アプリケーションの AppServiceProvider の boot メソッドで enablePasswordGrant メソッドを呼び出します。
public function boot(): void
{
Passport::enablePasswordGrant();
}
Sanctum
Sanctumの更新
影響の可能性: 高
Laravel 11 は Laravel Sanctum 3.x をサポートしなくなりました。したがって、composer.json ファイルでアプリケーションの Laravel Sanctum 依存関係を ^4.0 に更新する必要があります。
Sanctum 4.0 は、独自の移行ディレクトリから移行を自動的にロードしなくなりました。代わりに、次のコマンドを実行して、Sanctum の移行をアプリケーションに公開する必要があります。
php artisan vendor:publish --tag=sanctum-migrations
次に、アプリケーションの config/sanctum.php 構成ファイルで、authenticate_session、encrypt_cookies、および validate_csrf_token ミドルウェアへの参照を次のように更新する必要があります。
'middleware' => [
'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class,
'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class,
'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class,
],
Telescope
Telescopeの更新
影響の可能性: 高
Laravel 11 は Laravel Telescope 4.x をサポートしなくなりました。したがって、アプリケーションの Laravel Telescope 依存関係を、composer.json ファイル内の ^5.0 に更新する必要があります。
Telescope 5.0 は、独自の移行ディレクトリから移行を自動的にロードしなくなりました。代わりに、次のコマンドを実行して、Telescope の移行をアプリケーションに公開する必要があります。
php artisan vendor:publish --tag=telescope-migrations
スパティワンスパッケージ
影響の可能性: 中
Laravel 11 では、特定のクロージャが 1 回だけ実行されるようにするための独自の once関数 が提供されるようになりました。したがって、アプリケーションに spatie/once パッケージへの依存関係がある場合は、競合を避けるためにアプリケーションの composer.json ファイルから依存関係を削除する必要があります。
その他
laravel/laravel GitHub リポジトリ の変更内容も確認することをお勧めします。これらの変更の多くは必要ありませんが、これらのファイルをアプリケーションと同期させておきたい場合があります。これらの変更の一部はこのアップグレード ガイドで説明されますが、構成ファイルやコメントへの変更などのその他の変更については説明されません。 GitHub比較ツール を使用して変更を簡単に表示し、どの更新が自分にとって重要かを選択できます。