アップグレード手順


#アップグレード ガイド

    5.7 から 5.8.0 へのアップグレード
大きな影響を与える変更

    数秒でのキャッシュ TTL
  • キャッシュ ロックのセキュリティの向上
  • マークダウン ファイル パスの変更
  • Nexmo/Slack 通知チャネルの変更
中程度の影響の変更

#Container Builder とタグ サービス
  • SQLite バージョンの制約
  • ヘルパーを文字列および文字列のクラスに置き換えます。配列
  • 非推奨の遅延サービス プロバイダー
  • PSR-16 仕様に準拠
  • 不規則な複数形のモデル名の末尾を改善
  • 自動インクリメント ID 属性をカスタムに追加中間テーブル モデル
  • Pheanstalk 4.0 ライブラリのサポート
  • Laravel 5.7 から 5.8 へのアップデート

    推定アップグレード時間: 1 時間

    注: 考えられるすべての変更を文書化するよう努めています。ほとんどの重大な変更はフレームワークの内部にあるため、アプリケーションに影響を与える可能性があるのは、これらの変更のサブセットのみです。

    依存関係の更新

    composer.json で、laravel/framework 依存関係を 5.8.* に更新します。 。

    次に、アプリケーションにインストールされているサードパーティのパッケージが Laravel 5.8 をサポートしているかどうかを確認し、インストールされているバージョンが正しいかどうかを確認します。

    アプリケーション契約

    環境方法

    影響の可能性: 非常に低い

    イルミネーション/Contracts/Foundation/Application Classenvironment メソッドのシグネチャが変更されました。このメソッドがアプリケーションでオーバーライドされる場合は、このメソッドのシグネチャを更新する必要があります:

    /**
     * 获取或检查当前应用程序的环境
     *
     * @param  string|array  $environments
     * @return string|bool
     */public function environment(...$environments);

    新しく追加されたメソッド

    影響の可能性: 非常に低い

    次の新しいメソッドが追加されましたbootstrapPathconfigPathdatabasePathenvironmentPathresourcePathstoragePathresolveProviderbootstrapWithconfigurationIsCacheddetectEnvironmentenvironmentFileenvironmentFilePath , getCachedConfigPath, getCachedRoutesPath, getLocale, getNamespace, getProviders, hasBeenBootstraped , loadDeferredProviders, loadEnvironmentFrom, routesAreCached, setLocale, ShouldSkipMiddleware, terminate Illuminate/Contracts/Foundation/Application.

    このインターフェイスを実装する場合は、これらのメソッドを実装クラスに追加する必要があります。

    認証

    パスワード通知ルーティング パラメータのリセット

    影響の可能性: 低

    ユーザーがパスワードのリセット リンクをクリックすると、 Laravel は、route ヘルパーを使用して URL を生成し、password.reset という名前のルートを作成します。Laravel 5.7 を使用する場合、トークンは明示的な名前なしで URL に渡されます。 ##route ヘルパー、例:

    route('password.reset', $token);

    Laravel 5.8 を使用する場合、トークンは明示的なパラメーターとして

    route ヘルパーに渡されます:

    route('password.reset', ['token' => $token]);

    したがって、独自の

    password.reset ルートを定義する場合は、その URI にトークン パラメーターが含まれている必要があります。

    デフォルトのパスワードの長さが変更されました

    影響の可能性: 低

    パスワードの選択またはリセット時に必要なパスワードの長さが 8 文字以上に変更されました。

    キャッシュ

    TTL (数秒)

    影響の可能性: 非常に高い

    データを保存する際の有効期限をより細かく設定できるようにするために、キャッシュされたデータの有効期間が分から数秒に変更されました。 Illuminate\Cache\Repository クラスとその拡張クラス putputManyaddremember および #この更新は、すべてのキャッシュ ストアの ##setDefaultCacheTime メソッドと put メソッドで行われます。詳細は関連PRをご覧ください。

    これらのメソッドのいずれかに整数を渡す場合は、キャッシュに渡されるデータが数秒以内に渡されるようにコードを更新してください。さらに、

    DateTime インスタンスを渡してデータの有効期限がいつ切れるかを示すことができます:

    // Laravel 5.7 - 存储数据30分钟
    Cache::put('foo', 'bar', 30);// Laravel 5.8 - 存储数据30秒
    Cache::put('foo', 'bar', 30);// Laravel 5.7 / 5.8 - 存储数据30秒
    Cache::put('foo', 'bar', now()->addSeconds(30));

    {ヒント} この変更により、Laravel キャッシュ システムは PSR-16 キャッシュ ライブラリに完全に準拠します。標準。

    PSR-16 に従う

    影響の可能性: 中

    このアップグレードでは、上記の戻り値の変更に加えて、更新

    Illuminate\Cache\Repository クラスの putputMany、および add メソッドの TTL パラメータを変更して、準拠性を高めました。 PSR-16仕様です。新しい機能ではデフォルトの null が提供されるため、TTL 値を指定しない場合、キャッシュは永続的に保存され、期限切れになりません。さらに、キャッシュ エントリの TTL が 0 以下の場合、キャッシュ エントリはクリアされます。詳細については、関連する PR を参照してください。

    KeyWritten イベントもこれらの変更に基づいて更新されました。

    ロックセキュリティの改善

    影響の可能性: 高

    Laravel 5.7 およびそれ以前のバージョンの Laravel では、一部のキャッシュドライバーが「アトミックロック」を提供しています。この機能により、予期しない動作が原因でロックが早期に解除される可能性があります。

    例:

    クライアント A は 10 秒で期限切れになるロック foo を取得しました。 クライアント A は、タスクを完了するまでに実際には 20 秒かかります。 クライアント A タスクの実行中、ロックはキャッシュ システムによって自動的に解放されます。その後、クライアント B はロック foo を取得します。最終的に、クライアント A はタスクを完了し、ロック foo を解放しましたが、誤って クライアント B が保持していたロックを解放してしまいました。この時点で、クライアント C は再びロックを取得できます。

    この状況を軽減するために、埋め込み「スコープ トークン」を使用してロックが生成されるようになりました。これにより、通常の状況では、ロック保持者のみがロックを解放できるようになります。

    Cache::lock()->get(Closure) メソッドを使用してロックを使用している場合、変更は必要ありません。

    Cache::lock('foo', 10)->get(function () {    // 锁将会被安全的自动释放});

    ただし、

    Cache::lock()->release() を手動で呼び出すには、コードを更新してロックのインスタンスを維持する必要があります。次に、タスクの完了後、同じロック インスタンスで release メソッドを呼び出すことができます。例えば:###

    if (($lock = Cache::lock('foo', 10))->get()) {    // 执行任务…    $lock->release();}

    あるプロセスでロックを取得し、別のプロセスでロックを解放したい場合があります。たとえば、Web リクエスト中にロックを取得し、そのリクエストによってトリガーされたキューに入れられたジョブが終了したときにロックを解放することができます。この場合、ジョブが指定されたトークンでロックを再インスタンス化できるように、ロックのスコープ「所有者トークン」をキューに入れられたジョブに渡す必要があります。現在の所有者のないロックの場合は、

    forceRelease

    メソッド:

    // 在控制器中…$podcast = Podcast::find(1);
    if (($lock = Cache::lock('foo', 120))->get()) {
        ProcessPodcast::dispatch($podcast, $lock->owner());}// 在进程广播队列中…
    Cache::restoreLock('foo', $this->owner)->release();

    Repository

    および Store Contract# を使用できます。 潜在的な影響: 非常に低い

    PSR-16

    の要件に完全に準拠するために、

    Illuminate\Contracts\Cache\Repositoryコントラクト put および forever メソッドの戻り値、および Illuminate\Contracts の putputMany \Cache\Store コントラクトと forever メソッドが void から bool に変更されました。 コレクション

    firstWhere

    メソッド

    影響の可能性: 非常に低い

    firstWhere

    メソッド パラメータは、

    where メソッドのシグネチャと一致するように変更されました。このメソッドをオーバーライドする場合は、その親と一致するようにメソッドのパラメータを更新する必要があります:

    Cache::lock('foo')->forceRelease();
    ターミナル

    カーネル

    コントラクト

    影響可能性: 非常に低い

    terminate

    メソッドが

    Illuminate/Contracts/Console/Kernel コントラクトに追加されました。このインターフェイスを実装する場合は、このメソッドを実装クラスに追加する必要があります。 コンテナ

    ジェネレータとタグサービス

    影響の可能性: 中

    コンテナのタグ付き

    メソッドは使用します指定されたタグでサービスを遅延インスタンス化する PHP ジェネレーター。この変更により、

    tagged メソッドは arrays ではなく iterable 型を返します。メソッドでタイプヒント付きの戻り値を使用する場合は、必ずタイプヒントも iterable に変更してください。 さらに、$container->tagged('foo')[0]

    など、配列オフセット値を介してタグ サービスに直接アクセスできなくなりました。

    resolve

    メソッド

    影響の可能性: 非常に低い

    resolve

    メソッドは新しいブール値パラメーターを受け取りますこれは、オブジェクトのインスタンス化 (解決コールバック) 中にイベントが発生/実行されるべきかどうかを示します。このメソッドをオーバーライドする場合は、親メソッドと一致するようにメソッド シグネチャを更新する必要があります。

    #addContextualBinding メソッド

    影響の可能性: 非常に低い

    Illuminate\Contracts\Container\Containerコントラクトは addContextualBinding

    メソッドを追加します。このインターフェースを実装したい場合は、このメソッドを実装に追加する必要があります。

    tagged メソッド

    影響の可能性: 低
    tagged メソッドは、代わりに iterable を返すようになりました。 array 型。コード パラメーターに型ヒントがある場合は、array 型の tagged メソッド ヒントをすべて検索し、型ヒントを iterable 型に変更します。

    flush メソッド

    影響の可能性: 非常に低い

    Illuminate\Contracts\Container\Container コントラクトは flush メソッドを追加します。このインターフェースを実装したい場合は、このメソッドを実装に追加する必要があります。

    データベース

    MySQL JSON 値が引用符で囲まれていない

    影響の可能性: 低

    MySQL と MariaDB を使用する場合、 Query コンストラクターによって返される JSON 値は引用符で囲まれません。他のデータベースはこれと一致するように動作します:

    /**
     * Get the first item by the given key value pair.
     *
     * @param  string  $key
     * @param  mixed  $operator
     * @param  mixed  $value
     * @return mixed
     */public function firstWhere($key, $operator = null, $value = null);

    したがって、->> 演算子はサポートされなくなり、必要なくなりました。

    SQLite

    影響の可能性: 中程度

    Laravel 5.8 以降、サポートされる SQLite の最も古いバージョンは SQLite 3.7.11 です。以前のバージョンの SQLite を使用している場合は、アップグレードする必要があります (SQLite 3.8.8 にアップグレードすることをお勧めします)。

    雄弁

    モデル名の不規則な複数末尾

    影響の可能性: 中程度

    Laravel 5.8 以降、モデル名が含まれています不規則な複数形で終わる複合名が正しく複数形化されるようになりました。

    $value = DB::table('users')->value('options->language');
    dump($value);
    // Laravel 5.7...
    '"en"'
    // Laravel 5.8...
    'en'

    モデル名で複数形名が正しく使用されていない場合は、モデル内で $table を定義します。引き続き使用できます。属性の後ろにあります:

    // Laravel 5.7...
    App\Feedback.php -> feedback (正确的复数形式)
    App\UserFeedback.php -> user_feedbacks (错误的复数形式)
    // Laravel 5.8
    App\Feedback.php -> feedback (正确的复数形式)
    App\UserFeedback.php -> user_feedback (正确的复数形式)

    ID が増加するカスタム リレー モデル

    カスタム リレー モデルと多対多の関係を定義する場合、さらに、このリレー モデルには自動インクリメントされるこのカスタム リレー モデル クラスが、値 true を持つ incrementing 属性を定義していることを確認する必要があります:

    /**
     * 与模型关联的数据表名称。
     *
     * @var string
     */protected $table = 'user_feedbacks';

    loadCount Method

    影響の可能性: 低

    基本クラスIlluminate\Database\Eloquent\Model loadCountメソッドに追加されました。アプリケーションで loadCount メソッドも定義している場合、Eloquent のメソッドと競合する可能性があります。

    originalIsEquivalent メソッド

    影響の可能性: 非常に低い

    Illuminate\Database\Eloquent\Concerns\HasAttributes トレイトの originalIsEquivalent メンバー メソッドが protected から public に変更されました。

    deleted_at 属性の自動削除変換変換

    影響の可能性: 低

    Eloquent モデルが Illuminate\Database\Eloquent\SoftDeletes トレイトを使用する場合、deleted_at メンバー属性は Carbon インスタンスに自動的に変換されるようになりました。この動作は、メンバー プロパティのカスタム アクセサーを記述するか、casts 属性:

    /**
     * 标识 ID 是否自增
     *
     * @var bool
     */public $incrementing = true;

    BelongsTo'sgetForeignKey に手動で追加することでオーバーライドできます。 メソッド

    影響の可能性: 低

    BelongsTo getForeignKey と # 関係内の ##getQualifiedForeignKey メソッドの名前は、それぞれ getForeignKeyNamegetQualifiedForeignKeyName に変更され、メソッド名は Laravel が提供する他の関係と一致するようになりました。

    イベント

    fireメソッド

    影響の可能性: 低

    Illuminate/Events/Dispatcher クラスの fire メソッド (Larevel 5.4 で非推奨) は削除されました。 代わりの
    dispatch を使用する必要があります。

    ExceptionHandler

    ExceptionHandler Contract

    影響の可能性: 低

    \Contracts を照らす\Debug\ExceptionHandler 新しい shouldReport メソッドがコントラクトに追加されました。例外ハンドラー インターフェイスを実装するときは、このメソッドも実装する必要があります。

    renderHttpException メソッド

    影響の可能性: 低

    ##Illuminate\Foundation\Exceptions\Handler

    シグネチャクラス内の renderHttpException メソッドのが変更されました。例外ハンドラーでこのメソッドをオーバーライドする場合は、その親クラスと一致するようにメソッドのシグネチャを変更する必要があります:

    protected $casts = ['deleted_at' => 'string'];
    Facades

    Facade Service Resolution

    影響の可能性: 低

    getFacadeAccessor

    メソッドは、サービス コンテナ ID を表す文字列のみを返すようになりました。以前は、このメソッドはオブジェクト インスタンスを返していました。 メール


    マークダウン ファイル パスの変更

    影響の可能性: 高

    すでに ## を使用している場合# Vendor:publish

    コマンドは、Laravel の Markdown 電子メール コンポーネントを公開します。

    /resources/views/vendor/mail/markdown パスの名前を text に変更する必要があります。 そして、markdownComponentPaths

    メソッドの名前が

    textComponentPaths に変更されました。このメソッドをオーバーライドする場合は、その親クラスと一致するようにメソッド名を更新する必要があります。 PendingMail

    クラスのメソッド パラメーターの変更

    影響の可能性: 非常に低い

    sendsendNowqueuelater、および Illuminate\Mail\PendingMail の # class ##fill メソッドは、Illuminate\Mail\Mailable インスタンスの代わりに Illuminate\Contracts\Mail\Mailable インスタンスをパラメータとして受け入れるように変更されました。メソッドをオーバーライドする場合は、その親クラスと一致するようにパラメータを更新する必要があります。

    キュー

    Pheanstalk 4.0

    影響の可能性: 中

    Laravel 5.8 はサポートを提供します

    ~4.0 Pheanstalk キューのリリース バージョン。アプリケーションで Pheanstalk ライブラリを使用している場合は、Composer を通じてライブラリを ~4.0 リリース バージョンにアップグレードしてください。

    仕事 契約

    影響の可能性: 非常に低い

    リリース失敗 メソッドと markAsFailed メソッドが Illuminate\Contracts\Queue\Job コントラクトに追加されました。このインターフェイスを実装している場合は、これらのメソッドを実装コードに追加する必要があります。

    Job::failed & FailingJob Class

    潜在的な影響: 非常に低い

    In In Laravel 5.7 では、キュータスクが失敗すると、キューワーカーは

    FailingJob::handle メソッドを実行します。 Laravel 5.8では、FailingJobクラスのロジックが、このタスククラスで定義されているfailメソッドに移行されました。このため、fail メソッドは Illuminate\Contracts\Queue\Job コントラクトに含まれています。

    Illuminate\Queue\Jobs\Job 基本クラスには fail の実装が含まれており、通常のアプリケーションのコードを変更する必要はありません。ただし、カスタム キュー ドライバーを構築していて、Laravel が提供するタスク基本クラスから 継承しないタスク クラスがある場合は、それをカスタム タスク クラスに手動で実装する必要がありますfail## # 方法。実装の参考として、Laravel のタスク基本クラスを確認してください。 この変更により、キュー ドライバーをカスタマイズして、タスク削除プロセスをより詳細に制御できるようになります。

    Redis ブロッキング ポップ

    影響の可能性: 非常に低い

    Redis キュー ドライバーの「ブロッキング ポップ」機能を安全に使用できるようになりました。 。以前は、タスクの取得中に Redis サービスまたはワーカーがオフラインになった場合、キュー内のタスクが失われる可能性がありました (確率は低いですが)。ポップのブロックを安全にするために、:notify

    サフィックスが付いた新しい Redis リストが Laravel キューごとに作成されます。

    Request

    TransformsRequest

    Middleware

    影響の可能性: 低

    現在、リクエスト入力時が配列の場合、Illuminate\Foundation\Http\Middleware\TransformsRequest

    ミドルウェアの

    transform メソッドは、「完全修飾」リクエスト入力キーを受け取ります:

    /**
     * 将给定的 Http 异常转换为 Http 响应。
     *
     * @参数 \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface  $e
     * @返回 \Symfony\Component\HttpFoundation\Response
     */protected function renderHttpException(HttpExceptionInterface $e);
    Routing

    UrlGenerator

    プロトコル

    影響の可能性: 非常に低い

    previous メソッドが Illuminate\Contracts\Routing\UrlGenerator コントラクトに追加されました。このインターフェースを呼び出したい場合は、このメソッドを実装に追加する必要があります。

    cachedSchema

    Illuminate/Routing/UrlGenerator の機能

    影響の可能性: 非常に低い

    Illuminate/Routing/UrlGenerator$cachedSchema プロパティ (Laravel 5.7 では非推奨) が $cachedScheme に変更されました。

    セッション

    StartSession ミドルウェア

    影響の可能性: 非常に低い

    セッションの永続性 ロジックterminate() メソッドから handle() メソッドに移動されました。メソッド内のメソッドをオーバーライドする場合は、変更を反映するようにメソッドを更新する必要があります。

    サポート

    ヘルパー関数よりも文字列クラスと配列クラスを優先します

    影響の可能性: 中

    すべてarray_* および str_* グローバル ヘルパー関数は非推奨になりました。 Illuminate\Support\Arr および Illuminate\Support\Str によって提供されるメソッドを直接使用する必要があります。

    これらのヘルパー関数は下位互換性を向上させるために新しい laravel/helpers 拡張パッケージに移動されるため、この調整の影響は中程度とマークされています。

    遅延されたサービス プロバイダー

    影響の可能性: 中

    プロバイダーを遅延するかどうかを示すサービス プロバイダーの defer ブール プロパティが変更されました。廃止されました。ここで、サービス プロバイダーを遅延としてマークしたい場合は、Illuminate\Contracts\Support\DeferrableProvider コントラクトを実装する必要があります。

    テスト

    PHPUnit 8

    影響の可能性: オプション

    デフォルトでは、Laravel 5.8 は PHPUnit 7 を使用します。ただし、PHPUnit 8 にアップグレードすることはできますが、これには PHP 7.2 以上が必要です。詳細については、PHPUnit 8 リリースのお知らせをお読みください。

    setUp メソッドと tearDown メソッドには void 戻り値の型が必要になりました:

    'employee' => [    'name' => 'Taylor Otwell',],/**
        * 转换给定的值.
        *
        * @param  string  $key
        * @param  mixed  $value
        * @return mixed
        */protected function transform($key, $value){    dump($key); // 'employee.name' (Laravel 5.8)    dump($key); // 'name' (Laravel 5.7)}

    Validation

    Validator契約

    影響の可能性: 非常に低い

    validatedメソッドが Illuminate\Contracts\Validation\Validator に追加されました:

    protected function setUp(): voidprotected function tearDown(): void

    このインターフェイスを呼び出す場合は、このメソッドの実装を追加する必要があります。

    ValidatesAttributes 属性

    影響の可能性: 非常に低い

    ##Illuminate\Validation\Concerns\ValidatesAttributes属性内の parseTablegetQueryColumn、および requireParameterCount メソッドの可視性が、protected から public に調整されます。

    DatabasePresenceVerifier クラス

    影響の可能性: 非常に低い

    Illuminate\Validation\DatabasePresenceVerifier クラスtable メソッドの可視性が protected から public に調整されます。

    Validator クラス

    影響の可能性: 非常に低い

    Illuminate\Validation\Validator クラス getPresenceVerifierFor メソッドの可視性が protected から public に調整されました。

    電子メール検証

    影響の可能性: 非常に低い

    電子メール検証ルールでは、電子メール アドレスが RFC5630 と互換性があるかどうかがチェックされるようになりました。と SwiftMailer は一貫性を保ちます。 Laravel 5.7 では、email ルールは電子メール アドレスが RFC822 に準拠していることのみを検証します。

    そのため、Laravel 5.8 を使用する場合、以前は無効と見なされていた電子メール アドレス (例: hej@bär.se) が有効とみなされるようになります。通常、これはバグ修正とみなされますが、注意としてここに記載します。この変更に関して問題が発生した場合は、お知らせください。

    View

    getData メソッド

    影響の可能性: 非常に低い

    Illuminate\Contracts\View新しい getData メソッドが \View コントラクトに追加されました。このインターフェイスを呼び出す場合は、このメソッドの実装を追加する必要があります。

    通知

    Nexmo / Slack 通知チャネル

    潜在的な影響: 高

    Nexmo および Slack 通知チャネルが進化しました 公式拡張進行中です。これらのチャネルを独自のアプリケーションで使用するには、次の拡張パッケージをインストールする必要があります:

    /**
     * 获取已验证的属性和值。
     *
     * @return array
     */public function validated();

    Others

    また、laravel/laravel# の変更ログを確認することをお勧めします。 ## コード リポジトリ。これらの更新の多くは必須ではありませんが、アプリケーション内のこれらのファイルをコード リポジトリと同期しておくことができます。これらの更新の一部はこのアップグレード ガイドですでに説明されていますが、リストされていないその他のマイナーな更新 (構成ファイルや注釈への変更など) が多数あります。 GitHub 比較ツールを使用すると、どの更新がより重要であるかを確認できます。

    この記事は、