重要度の高い変更
重要度が中程度の変更
6.xから7.0へのアップグレード
アップグレード見積もり時間:15分
Note: 私達は、互換性を失う可能性がある変更を全部ドキュメントにしようとしています。しかし、変更点のいくつかは、フレームワークの明確ではない部分で行われているため、一部の変更が実際にアプリケーションに影響を与えてしまう可能性があります。
Symfony5要件
影響の可能性: 高い
Laravel7は裏で動作しているSymfonyコンポーネントを5.xへアップグレードしました。新しい最低限のコンパチブルバージョンもこれになりました。
PHP 7.2.5要件
影響の可能性: 低い
新しいPHPの最低動作バージョンは7.2.5になりました。
依存パッケージのアップデート
composer.json
ファイル中に指定されている以下のパッケージ依存を更新してください。
laravel/framework
を^7.0
へnunomaduro/collision
を^4.1
へphpunit/phpunit
を^8.5
へlaravel/tinker
を^2.0
へfacade/ignition
を^2.0
へ
以下のファーストパーティ製パッケージは、Laravel7に対応する新しいメジャーリリースを出しました。どれか使用しているのであれば、それぞれのアップグレードガイドをLaravel7へのアップグレードの前にお読みください。
- Browser Kit Testing v6.0
- Envoy v2.0
- Horizon v4.0
- Nova v3.0
- Passport v9.0
- Scout v8.0
- Telescope v3.0
- Tinker v2.0
- UI v2.0 (No changes necessary)
最後に、皆さんのアプリケーションで使用する他のサードパーティ製パッケージを調べ、Laravel7に対応するバージョンを使用していることを確認してください。
Symfony5へのアップグレード
影響の可能性: 高い
Laravel7は、Symfonyコンポーネントの5.xシリーズを活用しています。このアップグレードを含め、いくつか細かいアプリケーションの修正が必要となります。
最初に、アプリケーションのApp\Exceptions\Handler
クラスのreport
とrender
、shouldReport
、renderForConsole
メソッドは、Exception
インスタンスに代えThrowable
インターフェイスのインスタンスを受け取る必要があります。
use Throwable;
public function report(Throwable $exception);
public function shouldReport(Throwable $exception);
public function render($request, Throwable $exception);
public function renderForConsole($output, Throwable $exception);
次に、session
設定ファイルのsecure
オプションをフォールバック値のnull
へ変更してください。
'secure' => env('SESSION_SECURE_COOKIE', null),
Artisanの裏で動作しているSymfony Consoleはすべてのコマンドが整数値を返すことを期待しています。そのため値を返すすべてのコマンドは確実に整数を返してください。
public function handle()
{
// 以前
return true;
// 以後
return 0;
}
認証
スカフォールド
影響の可能性: 高い
すべての認証スカフォールドはlaravel/ui
リポジトリへ移動済みです。Laravelの認証スカフォールドを使用する場合は、このパッケージの^2.0
リリースをインストールしてください。すべての環境でこのパッケージをインストールしてください。アプリケーションのcomposer.json
ファイル中で以前にこのパッケージをrequire-dev
で依存指定していた時は、require
に移動する必要があります。
composer require laravel/ui "^2.0"
TokenRepositoryInterface
影響の可能性: 低い
Illuminate\Auth\Passwords\TokenRepositoryInterface
インターフェイスへrecentlyCreatedToken
メソッドを追加しました。このインターフェイスのカスタム実装を書いているときは、このメソッドを追加実装してください。
Blade
component
メソッド
影響の可能性: 中程度
Blade::component
メソッドはBlade::aliasComponent
へ名前を変えました。このメソッドの呼び出しを対応するように変更してください。
Bladeコンポーネントと"Blade x"
影響の可能性: 中程度
Laravel7はBlade「タグコンポーネント」のファーストパーティサポートを含んでいます。Bladeの組み込みタグコンポーネント機能を無効にしたい場合は、AppServiceProvider
のboot
メソッドでwithoutComponentTags
メソッドを呼び出してください。
use Illuminate\Support\Facades\Blade;
Blade::withoutComponentTags();
Eloquent
addHidden
/addVisible
メソッド
影響の可能性: 低い
ドキュメントに乗せなくなっていたaddHidden
とaddVisible
メソッドは削除しました。代わりにmakeHidden
とmakeVisible
メソッドを使用してください。
booting
/booted
メソッド
影響の可能性: 低い
モデルの「起動(boot)」処理中で実行すべきロジックを便利に定義できる箇所を提供するため、booting
とbooted
メソッドがEloquentへ追加されました。この名前のモデルメソッドをすでに使っている場合は、今回追加した新しいメソッドと衝突するため、リネームが必要になります。
データシリアライズ
影響の可能性: 高い
Laravel7はEloquentモデル上でtoArray
かtoJson
メソッド使用時に、新しい日付シリアライズ形式を使用しています。シリアライズの日付形式にするため、CarbonのtoJson
メソッドを使用するようになりました。これはタイムゾーンと秒の小数部を含んだISO-8601準拠の日付です。さらにこの変更により、クライアントサイドの日付パースライブラリの統合とより良いサポートが実現できました。
以前のシリアライズされた日付形式は2019-12-02 20:01:00
でした。新しいシリアライズ済み日付形式は2019-12-02T20:01:00.283041Z
のようになります。ISO-8601日付は常にUTCで表現されることに注意してください。
以前の振る舞いのままが好ましい場合は、モデルのserializeDate
メソッドをオーバーライドしてください。
use DateTimeInterface;
/**
* 配列/JSONシリアライズのためデータを準備する
*
* @param \DateTimeInterface $date
* @return string
*/
protected function serializeDate(DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}
Tip!! この変更はモデルとモデルコレクションの、配列とJSONへのシリアライズにだけ影響を及ぼします。この変更はデータベースに日付を保存する方法にはまったく影響しません。
Factoryタイプ
影響の可能性: 中程度
Laravel7では「ファクトリタイプ」機能を削除しました。この機能は2016年10月からドキュメントに記載していません。まだこの機能を利用している場合はより柔軟性が高いファクトリステートへアップグレードしてください。
getOriginal
メソッド
影響の可能性: 低い
$model->getOriginal()
メソッドはモデルで定義されるキャストとミューテタを反映するようにしました。以前のこのメソッドはキャストせず、元の値をそのまま返していました。元のままのキャストしない値を続けて取得したい場合は、代わりにgetRawOriginal
メソッドを使ってください。
ルート結合
影響の可能性: 低い
Illuminate\Contracts\Routing\UrlRoutable
インターフェイスのresolveRouteBinding
メソッドは、$field
引数を取るようになりました。このインターフェイスを実装している場合は変更してください。
さらにIlluminate\Database\Eloquent\Model
クラスのresolveRouteBinding
メソッドも$field
引数を取るようになりました。このメソッドをオーバーライドしている場合は、この引数を受け取るように変更する必要があります。
最後に、Illuminate\Http\Resources\DelegatesToResources
トレイトのresolveRouteBinding
メソッドでも$field
引数を取るようになりました。このメソッドをオーバーライドしている場合は、この引数を受け取るように変更する必要があります。
HTTP
PSR-7コンパチビリティ
影響の可能性: 低い
PSR-7レスポンスを生成するためのZend
Diactorosライブラリが非推奨となりました。このパッケージをPSR-7互換性のために使用している場合は、代わりにnyholm/psr7
Composerパッケージをインストールしてください。さらに、symfony/psr-http-message-bridge
Composerパッケージの^2.0
リリースもインストールしてください。
メール
設定ファイルの変更
影響の可能性: 状況による
複数のメイラーをサポートするために、Laravel7.xではデフォルトのmail
設定ファイルを変更し、mailers
の配列を含むようにしました。しかしながら、後方互換性のためにこのファイルのLaravel6.x形式もまだサポートしています。7.xへアップグレードするには変更は必要ありませんが、新しいmail
設定ファイルを確認し、変更を反映するほうを皆さん選ばれるでしょう。
Markdownメールテンプレートアップデート
影響の可能性: 中程度
デフォルトMarkdownテンプレートが、よりプロフェッショナルな見かけの良いデザインに刷新されました。さらに、ドキュメントに記載されていないpromotion
Markdownメールコンポーネントが削除されました。
Markdownではインデントが特別な意味を持っているため、MarkdownメールではHTMLがインデントされていないことが期待されています。Laravelのデフォルトメールテンプレートを以前にリソース公開していた場合は、メールテンプレートを再リソース公開するか、自分でアンインデントしてください。
php artisan vendor:publish --tag=laravel-mail --force
Swift Mailer Bindings
影響の可能性: 低い
Laravel7.xでは、swift.mailer
とswift.transport
のコンテナ結合は提供していません。これらのオブジェクトは、mailer
の結合を経由してアクセスできます。
$swiftMailer = app('mailer')->getSwiftMailer();
$swiftTransport = $swiftMailer->getTransport();
リソース
Illuminate\Http\Resources\Json\Resource
クラス
影響の可能性: 低い
非推奨だったIlluminate\Http\Resources\Json\Resource
クラスは削除されました。代わりにリソースはIlluminate\Http\Resources\Json\JsonResource
を拡張してください。
ルート
ルータのgetRoutes
メソッド
影響の可能性: 低い
ルータのgetRoutes
メソッドはIlluminate\Routing\RouteCollection
のインスタンスの代わりに、Illuminate\Routing\RouteCollectionInterface
のインスタンスを返すようになりました。
一意のルート名
影響の可能性: 中程度
公式にはドキュメントに載せていませんが、以前のLaravelリリースでは異なった2つのルートを同じ名前で定義できていました。Laravel7ではこれはできなくなり、いつでもルートに一意の名前を指定する必要があります。重複する名前を持つルートはフレームワークの複数のエリアで、予期せぬ振る舞いを引き起こす可能性があります。
CORSサポート
影響の可能性: 中程度
Cross-Origin Resource Sharing
(CORS)がデフォルトで統合されました。もしサードパーティ製ライブラリを使用していた場合は、新しいcors
設定ファイルを使用することを勧めます。
次に、アプリケーションの依存パッケージへ、Laravelの後ろで動作するCORSライブラリをインストールします。
composer require fruitcake/laravel-cors
最後に、App\Http\Kernel
グローバルミドルウェアへ\Fruitcake\Cors\HandleCors::class
ミドルウェアを追加します。
セッション
array
セッションドライバ
影響の可能性: 低い
array
セッションドライバのデータは、現在のリクエスト中維持するようになりました。以前は、array
セッションに保存したデータは、現在のリクエスト中でさえ取得できませんでした。
テスト
assertSee
アサーション
影響の可能性: 中程度
TestResponse
クラスのassertSee
、assertDontSee
、assertSeeText
、assertDontSeeText
、assertSeeInOrder
、assertSeeTextInOrder
アサーションは、自動的に値をエスケープするようになりました。これらのアサーションに渡す値を今まで自分でエスケープしていたのであれば、これからはそうしてはいけません。エスケープしない値でアサートする必要がある場合は、メソッドの第2引数にfalse
を指定してください。
TestResponse
クラス
影響の可能性: 低い
Illuminate\Foundation\Testing\TestResponse
クラスはIlluminate\Testing\TestResponse
へリネームされました。もしこのクラスを拡張していた場合は、名前空間を確実に変更してください。
The Assert
Class
影響の可能性: 低い
Illuminate\Foundation\Testing\Assert
クラスはIlluminate\Testing\Assert
へリネームされました。このクラスを使用していた場合は、名前空間部分を変更してください。
バリデーション
different
ルール
影響の可能性: 中程度
different
ルールは、リクエストに指定したパラメータのうちの1つが足りないければ失敗するようになりました。
その他
laravel/laravel
のGitHubリポジトリで、変更を確認することを推奨します。これらの変更は必須でありませんが、皆さんのアプリケーションではファイルの同期を保つほうが良いでしょう。変更のいくつかは、このアップグレードガイドで取り扱っていますが、設定ファイルやコメントなどの変更は取り扱っていません。変更は簡単にGitHubの比較ツールで閲覧でき、みなさんにとって重要な変更を選択できます。