Laravel 7.x アップグレードガイド

重要度の高い変更

重要度が中程度の変更

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.1laravel/tinker^2.0facade/ignition^2.0へアップデートしてください。

以下のファーストパーティ製パッケージは、Laravel7に対応する新しいメジャーリリースを出しました。どれか使用しているのであれば、それぞれのアップグレードガイドをLaravel7へのアップグレードの前にお読みください。

最後に、皆さんのアプリケーションで使用する他のサードパーティ製パッケージを調べ、Laravel7に対応するバージョンを使用していることを確認してください。

Symfony5へのアップグレード

影響の可能性: 高い

Laravel7は、Symfonyコンポーネントの5.xシリーズを活用しています。このアップグレードを含め、いくつか細かいアプリケーションの修正が必要となります。

最初に、アプリケーションのApp\Exceptions\HandlerクラスのreportrendershouldReportrenderForConsoleメソッドは、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の組み込みタグコンポーネント機能を無効にしたい場合は、AppServiceProviderbootメソッドでwithoutComponentTagsメソッドを呼び出してください。

use Illuminate\Support\Facades\Blade;

Blade::withoutComponentTags();

Eloquent

addHiddenaddVisibleメソッド

影響の可能性: 低い

ドキュメントに乗せなくなっていたaddHiddenaddVisibleメソッドは削除しました。代わりにmakeHiddenmakeVisibleメソッドを使用してください。

bootingbootedメソッド

影響の可能性: 低い

モデルの「起動(boot)」処理中で実行すべきロジックを便利に定義できる箇所を提供するため、bootingbootedメソッドがEloquentへ追加されました。この名前のモデルメソッドをすでに使っている場合は、今回追加した新しいメソッドと衝突するため、リネームが必要になります。

データシリアライズ

影響の可能性: 高い

Laravel7はEloquentモデル上でtoArraytoJsonメソッド使用時に、新しい日付シリアライズ形式を使用しています。シリアライズの日付形式にするため、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.mailerswift.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クラスのassertSeeassertDontSeeassertSeeTextassertDontSeeTextassertSeeInOrderassertSeeTextInOrderアサーションは、自動的に値をエスケープするようになりました。これらのアサーションに渡す値を今まで自分でエスケープしていたのであれば、これからはそうしてはいけません。エスケープしない値でアサートする必要がある場合は、メソッドの第2引数にfalseを指定してください。

TestResponseクラス

影響の可能性: 低い

Illuminate\Foundation\Testing\TestResponseクラスはIlluminate\Testing\TestResponseへリネームされました。もしこのクラスを拡張していた場合は、名前空間を確実に変更してください。

The Assert Class

影響の可能性: 低い

Illuminate\Foundation\Testing\AssertクラスはIlluminate\Testing\Assertへリネームされました。このクラスを使用していた場合は、名前空間部分を変更してください。

バリデーション

differentルール

影響の可能性: 中程度

differentルールは、リクエストに指定したパラメータのうちの1つが足りないければ失敗するようになりました。

その他

laravel/laravelGitHubリポジトリで、変更を確認することを推奨します。これらの変更は必須でありませんが、皆さんのアプリケーションではファイルの同期を保つほうが良いでしょう。変更のいくつかは、このアップグレードガイドで取り扱っていますが、設定ファイルやコメントなどの変更は取り扱っていません。変更は簡単にGitHubの比較ツールで閲覧でき、みなさんにとって重要な変更を選択できます。

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる