アップグレード手順
- 5.7 から 5.8.0 へのアップグレード
- 数秒でのキャッシュ TTLキャッシュ ロックのセキュリティの向上マークダウン ファイル パスの変更Nexmo/Slack 通知チャネルの変更
- 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);
新しく追加されたメソッド
影響の可能性: 非常に低い
次の新しいメソッドが追加されましたbootstrapPath
、configPath
、databasePath
、environmentPath
、resourcePath
、storagePath
、resolveProvider
、bootstrapWith
、configurationIsCached
、detectEnvironment
、environmentFile
、environmentFilePath
, 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
クラスとその拡張クラス put
、 putMany
、 add
、 remember
および #この更新は、すべてのキャッシュ ストアの ##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 クラスの
put、
putMany、および
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() あるプロセスでロックを取得し、別のプロセスでロックを解放したい場合があります。たとえば、Web リクエスト中にロックを取得し、そのリクエストによってトリガーされたキューに入れられたジョブが終了したときにロックを解放することができます。この場合、ジョブが指定されたトークンでロックを再インスタンス化できるように、ロックのスコープ「所有者トークン」をキューに入れられたジョブに渡す必要があります。現在の所有者のないロックの場合は、 メソッド: PSR-16 Illuminate\Contracts\Cache\Repository firstWhere where を手動で呼び出すには、コードを更新してロックのインスタンスを維持する必要があります。次に、タスクの完了後、同じロック インスタンスで
release メソッドを呼び出すことができます。例えば:###
if (($lock = Cache::lock('foo', 10))->get()) { // 执行任务… $lock->release();}
// 在控制器中…$podcast = Podcast::find(1);
if (($lock = Cache::lock('foo', 120))->get()) {
ProcessPodcast::dispatch($podcast, $lock->owner());}// 在进程广播队列中…
Cache::restoreLock('foo', $this->owner)->release();
および
Store
Contract# を使用できます。
潜在的な影響: 非常に低いコントラクト
put および
forever メソッドの戻り値、および
Illuminate\Contracts の put
、putMany
\Cache\Store コントラクトと
forever メソッドが
void から
bool に変更されました。
コレクション
firstWhere
メソッド影響の可能性: 非常に低い
メソッドのシグネチャと一致するように変更されました。このメソッドをオーバーライドする場合は、その親と一致するようにメソッドのパラメータを更新する必要があります:
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 メソッドの名前は、それぞれ
getForeignKeyName と
getQualifiedForeignKeyName に変更され、メソッド名は Laravel が提供する他の関係と一致するようになりました。
fireメソッド
影響の可能性: 低
Illuminate/Events/Dispatcher クラスの
fire メソッド (Larevel 5.4 で非推奨) は削除されました。
代わりの
dispatch を使用する必要があります。
ExceptionHandler Contract
影響の可能性: 低
\Contracts を照らす\Debug\ExceptionHandler 新しい
shouldReport メソッドがコントラクトに追加されました。例外ハンドラー インターフェイスを実装するときは、このメソッドも実装する必要があります。
renderHttpException メソッド
影響の可能性: 低
##Illuminate\Foundation\Exceptions\Handler シグネチャクラス内の renderHttpException
メソッドのが変更されました。例外ハンドラーでこのメソッドをオーバーライドする場合は、その親クラスと一致するようにメソッドのシグネチャを変更する必要があります:
Facadesprotected $casts = ['deleted_at' => 'string'];
Facade Service Resolution
影響の可能性: 低
getFacadeAccessor
メソッドは、サービス コンテナ ID を表す文字列のみを返すようになりました。以前は、このメソッドはオブジェクト インスタンスを返していました。 メール
マークダウン ファイル パスの変更
影響の可能性: 高すでに ## を使用している場合# Vendor:publish
コマンドは、Laravel の Markdown 電子メール コンポーネントを公開します。/resources/views/vendor/mail/markdown パスの名前を
text に変更する必要があります。
そして、
markdownComponentPaths
textComponentPaths に変更されました。このメソッドをオーバーライドする場合は、その親クラスと一致するようにメソッド名を更新する必要があります。
PendingMail
影響の可能性: 非常に低い
send、
sendNow、
queue、
later、および
Illuminate\Mail\PendingMail
の # class ##fill メソッドは、
Illuminate\Mail\Mailable インスタンスの代わりに
Illuminate\Contracts\Mail\Mailable インスタンスをパラメータとして受け入れるように変更されました。メソッドをオーバーライドする場合は、その親クラスと一致するようにパラメータを更新する必要があります。
影響の可能性: 中
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 サービスまたはワーカーがオフラインになった場合、キュー内のタスクが失われる可能性がありました (確率は低いですが)。ポップのブロックを安全にするために、: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
コントラクトに追加されました。このインターフェースを呼び出したい場合は、このメソッドを実装に追加する必要があります。
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属性内の
parseTable、
getQueryColumn、および
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 比較ツールを使用すると、どの更新がより重要であるかを確認できます。