重要度の高い変更
重要度が中程度の変更
5.7から5.8.0へのアップグレード
アップグレードの見積もり時間:1時間
Note: 私達は、互換性を失う可能性がある変更を全部ドキュメントにしようとしています。しかし、変更点のいくつかは、フレームワークの明確ではない部分で行われているため、一部の変更が実際にアプリケーションに影響を与えてしまう可能性があります。
依存パッケージのアップデート
composer.json
ファイル中のlaravel/framework
パッケージのバージョンを5.8.*
にアップデートしてください。
次に、アプリケーションで使用している3rdパーティーパッケージを調査し、Laravel5.8をサポートしているバージョンを使用していることを確認してください。
Application
契約
environment
メソッド
影響の可能性: とても低い
Illuminate\Contracts\Foundation\Application
契約で利用法が規定されているenvironment
メソッドは変更されました。アプリケーションでこの契約を実装している場合は、メソッドの使用法を更新してください。
/**
* アプリケーション環境の取得もしくは判定
*
* @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
、hasBeenBootstrapped
、loadDeferredProviders
、loadEnvironmentFrom
、routesAreCached
、setLocale
、shouldSkipMiddleware
、terminate
メソッドがIlluminate\Contracts\Foundation\Application
契約に追加されました。
このインターフェイスを実装している可能性はとても低いと思われますが、実装している場合はこれらのメソッドを追加してください。
認証
パスワードリセット通知ルートパラメータ
影響の可能性: 低い
ユーザーがパスワードをリセットするためのリンクを必要とする場合、Laravelはpasswrod.reset
名前付きルートに対するURLをroute
ヘルパを利用し生成します。Laravel5.7使用時、明確な名前無しにroute
ヘルパへトークンを渡してしました。
route('password.reset', $token);
Laravel5.8を使用する場合は、明確なパラメータとしてroute
ヘルパへトークンを渡します。
route('password.reset', ['token' => $token]);
そのため、独自のpassword.reset
ルートを定義している場合、{token}
パラメータを確実にURIへ含めてください。
新しいデフォルトパスワード長
影響の可能性: 高い
パスワードの選択とリセット時に要求されるパスワード長が、8文字へ変更されました。この新しい8文字長のデフォルトに合うように、アプリケーション中のバリデーションルールやロジックを変更してください。
以前の6文字長を保持する、もしくは他の長さへ変更する必要がある場合は、Illuminate\Auth\Passwords\PasswordBroker
クラスを拡張し、validatePasswordWithDefaults
メソッドをオーバーライドし、カスタムロジックを組み込んでください。
キャッシュ
持続時間が秒指定に
影響の可能性: とても高い
より細かい時間でアイテムの保存時間を扱えるように、キャッシュの保存時間は分から秒単位になりました。Illuminate\Cache\Repository
クラスとこれを拡張したクラスのput
、putMany
、add
、remember
、setDefaultCacheTime
メソッド、並びに各キャッシュ保存のput
メソッドはこの動作変更へ更新されました。詳細は、関係するPRをご覧ください。
前述のメソッドに整数値を渡している場合、キャッシュにアイテムを残したい時間が秒数になったことに留意し、コードを変更してください。言い換えれば、アイテムの期限がいつ切れるかを表すDateTime
インスタンスを渡したほうが良いでしょう。
// Laravel5.7:30分アイテムは保存される
Cache::put('foo', 'bar', 30);
// Laravel5.8:30秒アイテムは保存される
Cache::put('foo', 'bar', 30);
// Laravel5.7と5.8:30秒アイテムは保存される
Cache::put('foo', 'bar', now()->addSeconds(30));
Tip!! この変更により、Laravelキャッシュシステムは、PSR-16キャッシュライブラリ基準に完全に準拠しました。
PSR-16準拠
影響の可能性: 中程度
前記により返却値が変更されたことに付け加え、Illuminate\Cache\Repository
クラスのput
、putMany
、add
メソッドのTTL引数もPSR-16基準をより準拠するように変更しました。デフォルトはnull
で、TTLを指定しない呼び出しの新しい振る舞いは、キャッシュアイテムを永久に保存することになりました。さらに、TTLが0か負数の場合はキャッシュから削除されます。詳細は、関連するPRをご覧ください。
KeyWritten
イベントもこの変更により、更新されました。
ロックの安全性向上
影響の可能性: 高い
バージョン5.7以前のLaravelでは、いくつかのキャッシュドライバで提供されていた「アトミックロック」機能は予測しない動作を引き起こす可能性がありました。
たとえば、クライアントAが10秒間有効なfoo
ロックを獲得します。クライアントAがタスクを終了するまで実際には20秒かかるとします。クライアントAの処理中に、10秒立つとキャッシシステムのロックが自動的に解除されます。クライアント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リクエストでロックを獲得し、そのリクエストから起動したキュー済みジョブの最後で、ロックを開放したい場合です。そのようなシナリオでは、ジョブで渡されたトークンを使い、ロックを再インスタンス化できるように、ロックを限定する「所有者(owner)のトークン」をキューするジョブへ渡す必要があります。
// コントローラ側
$podcast = Podcast::find(1);
if (($lock = Cache::lock('foo', 120))->get()) {
ProcessPodcast::dispatch($podcast, $lock->owner());
}
// ProcessPodcastジョブ側
Cache::restoreLock('foo', $this->owner)->release();
現在の所有者にかかわらず、ロックを開放したい場合は、forceRelease
メソッドを使用します。
Cache::lock('foo')->forceRelease();
Repository
とStore
契約
影響の可能性: とても低い
Illuminate\Contracts\Cache\Repository
契約のput
とforever
メソッド、およびIlluminate\Contracts\Cache\Store
契約のput
、putMany
、forever
メソッドの返却値をPSR-16
へ完全に準拠させるため、void
からbool
へ変更されました。
コレクション
add
メソッド
影響の可能性: とても低い
add
メソッドは、Eloquentのコレクションクラスから、ベースコレクションクラスへ移動しました。Illuminate\Support\Collection
を拡張し、拡張したクラスにadd
メソッドがある場合は、メソッドの用法が親クラスと一致するようにしてください。
public function add($item);
firstWhere
メソッド
影響の可能性: とても低い
where
メソッドの使用法と合わせるために、firstWhere
メソッドの使用法が変更されました。このメソッドをオーバーライドしている場合は、メソッドの使用方法を親クラスと合わせてください。
/**
* 指定したキー/値ペアの最初のアイテムを取得
*
* @param string $key
* @param mixed $operator
* @param mixed $value
* @return mixed
*/
public function firstWhere($key, $operator = null, $value = null);
コンソール
Kernel
契約
影響の可能性: とても低い
terminate
メソッドがIlluminate\Contracts\Console\Kernel
契約へ追加されました。このインターフェイスを実装している場合は、このメソッドを追加してください。
コンテナ
ジェネレータとタグ付けサービス
影響の可能性: 中程度
コンテナのtagged
メソッドは、指定したタグのサービスに対し、PHPジェネレータの遅延インスタンス化を活用するようになりました。これにより、タグつけしたサービスを全部使用しない場合に、パフォーマンスの改善を達成しました。
この変更により、tagged
メソッドは配列(array
)の代わりに、iterable
を返すようになりました。このメソッドの返却値をタイプヒントしている場合は、iterable
へ確実に変更してください。
付け加えると、$container->tagged('foo')[0]
のように、配列のオフセット値により直接タグ付けサービスへアクセスすることは、もうできなくなりました。
resolve
メソッド
影響の可能性: とても低い
resolve
メソッドは新しい論理値引数を受け取るようになりました。これはオブジェクトのインスタンス化の間に、(コールバックを解決する)イベントが発生させられるか/実行されるかを指示します。このメソッドをオーバーライドしている場合、親クラスのものと一致するようにメソッドの使用法を変更してください。
addContextualBinding
メソッド
影響の可能性: とても低い
addContextualBinding
メソッドが、Illuminate\Contracts\Container\Container
契約に追加されました。このインターフェイスを実装している場合は、このメソッドを追加してください。
tagged
メソッド
影響の可能性: 低い
tagged
メソッドの使用法が変更されました。そして、配列の代わりにiterable
を返すようになりました。皆さんコードの引数として、このメソッドの返却値を配列としてタイプヒントしている場合は、iterable
へ変更してください。
flush
メソッド
影響の可能性: とても低い
flush
メソッドがIlluminate\Contracts\Container\Container
契約へ追加されました。このインターフェイスを実装している場合は、このメソッドを追加してください。
データベース
クオートしないMySQL JSON値
影響の可能性: 低い
MySQLとMariaDBを使用している場合、クエリビルダはクオートしないJSON値を返すようになりました。この振る舞いは、サポートしている他のデータベースと一貫性を持たせるためです。
$value = DB::table('users')->value('options->language');
dump($value);
// Laravel5.7
'"en"'
// Laravel5.8
'en'
その結果として、->>
操作子は必要なくなり、サポートされなくなりました。
SQLite
影響の可能性: 中程度
Laravel5.8がサポートする一番古いSQLiteバージョンはSQLite3.7.11です。より古いSQLiteバージョンを使用している場合は、アップデートしてください。SQLite3.8.8以上を推奨します。
マイグレーションとbigIncrements
影響の可能性: なし
Laravel5.8では、マイグレーションスタブのデフォルトとして、IDカラムにbigIncrements
を使います。以前のバージョンでは、IDカラムはincrements
メソッドを使用し、生成されていました。
これは既存のプロジェクトのコードへ、影響を与えません。しかしながら、外部キーを同じタイプにするように気を付けてください。increments
メソッドを使用して生成されたカラムは、bigIncrements
メソッドを使って生成したカラムを参照できないためです。
Eloquent
不規則変化する複数形のモデル名
影響の可能性: 中程度
Laravel5.8では、複数後のモデル名で不規則変化する単語で終わる場合も、正しい複数形になるようになりました。
// Laravel5.7
App\Feedback.php -> feedback (正しい複数形)
App\UserFeedback.php -> user_feedbacks (間違った複数形)
// Laravel5.8
App\Feedback.php -> feedback (正しい複数形)
App\UserFeedback.php -> user_feedback (正しい複数形)
間違った複数形のモデルがある場合は、モデルの$table
プロパティを定義することにより、古いテーブル名を続けて使用できます。
/**
* モデルと関連するテーブル
*
* @var string
*/
protected $table = 'user_feedbacks';
IDが増加するカスタムピボットモデル
カスタムピボットモデルを使用する多対多リレーションを定義しており、そのピボットモデルが自動増分の主キーを持つ場合、カスタムピボットモデルクラスで確実にincrementing
プロパティを定義し、true
をセットしてください。
/**
* IDが自動増分する
*
* @var bool
*/
public $incrementing = true;
loadCount
メソッド
影響の可能性: 低い
loadCount
メソッドが、ベースのIlluminate\Database\Eloquent\Model
クラスへ追加されました。皆さんのアプリケーションでもloadCount
メソッドを定義している場合、Eloquentの定義と名前が衝突してしまいます。
originalIsEquivalent
メソッド
影響の可能性: とても低い
Illuminate\Database\Eloquent\Concerns\HasAttributes
トレイトのoriginalIsEquivalent
メソッドが、protected
からpublic
へ変更されました。
ソフト削除のdeleted_at
プロパティの自動キャスト
影響の可能性: 低い
Illuminate\Database\Eloquent\SoftDeletes
トレイトを使用しているEloquentモデルを使用している場合、deleted_at
プロパティはCarbon
インスタンスへ、自動的にキャストされるようになりました。この振る舞いはプロパティのカスタムアクセサを書くか、casts
属性へ追加することによりオーバーライドできます。
protected $casts = ['deleted_at' => 'string'];
BelongsToのgetForeignKey
とgetOwnerKey
メソッド
影響の可能性: 低い
Laravelにより提供されている他のリレーションのメソッド名と統一するために、BelongsTo
のgetForeignKey
、getQualifiedForeignKey
、getOwnerKey
メソッドは、getForeignKeyName
、getQualifiedForeignKeyName
、getOwnerKeyName
へ名前が変わりました。
環境変数のパース
影響の可能性: 高い
.env
ファイルのパースに利用している、phpdotenvパッケージが新しいメジャーバージョンをリリースしました。そのため、env
ヘルパ画の戻り値に影響が起きます。クオートされていない#
文字は、値の一部ではなくコメントとして扱われるようになりました。
以前の振る舞い:
ENV_VALUE=foo#bar
env('ENV_VALUE'); // foo#bar
新しい振る舞い:
ENV_VALUE=foo#bar
env('ENV_VALUE'); // foo
もとの振る舞いにするには、環境変数をクオートしてください。
ENV_VALUE="foo#bar"
env('ENV_VALUE'); // foo#bar
より詳細な情報は、phpdotenvアップグレードガイドを参照してください。
イベント
fire
メソッド
影響の可能性: 低い
Laravel5.4で非推奨になっていた、Illuminate\Events\Dispatcher
クラスのfire
メソッドが、削除されました。
代わりに、dispatch
メソッドを使用してください。
例外処理
ExceptionHandler
契約
影響の可能性: 低い
shouldReport
メソッドがIlluminate\Contracts\Debug\ExceptionHandler
契約へ追加されました。このインターフェイスを実装している場合は、メソッドを追加してください。
renderHttpException
メソッド
影響の可能性: 低い
Illuminate\Foundation\Exceptions\Handler
クラスのrenderHttpException
メソッドの使用法が変更されました。例外ハンドラのこのメソッドをオーバーライドしている場合は、親クラスとメソッドの使い方を合わせるように変更してください。
/**
* 渡されたHttpExceptionをレンダーする
*
* @param \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface $e
* @return \Symfony\Component\HttpFoundation\Response
*/
protected function renderHttpException(HttpExceptionInterface $e);
メール
Markdownファイルのディレクトリ変更
影響の可能性: 高い
LaravelのMarkdownメールコンポーネントをvendor:publish
コマンドでリソース公開している場合は、/resources/views/vendor/mail/markdown
ディレクトリを/resources/views/vendor/mail/text
へリネームしてください
さらに、markdownComponentPaths
メソッドはtextComponentPaths
へリネームされました。このメソッドをオーバーライドしている場合は、親のクラスへ合わせるようにメソッド名を変更してください。
PendingMail
クラスのメソッド使用法変更
影響の可能性: とても低い
Illuminate\Mail\Mailable
の代わりにIlluminate\Contracts\Mail\Mailable
を受け付けるため、Illuminate\Mail\PendingMail
クラスのsend
、sendNow
、queue
、later
、fill
メソッドは変更されました。これらのメソッドをオーバーライドしている場合は、親クラスと使用法を合わせるように更新してください。
キュー
Pheanstalk4.0
影響の可能性: 中程度
Laravel5.8は、Pheanstalkキューライブラリの~4.0
をサポートしました。皆さんのアプリケーションでPheanstalkライブラリを使用している場合は、Composerを使用し~4.0
リリースへライブラリをアップグレードしてください。
Job
契約
影響の可能性: とても低い
isReleased
、hasFailed
、markAsFailed
メソッドが、Illuminate\Contracts\Queue\Job
契約へ追加されました。このインターフェイスを実装してる場合は、これらのメソッドを追加してください。
Job::failed
とFailingJob
クラス
影響の可能性: とても低い
Laravel5.7ではキューされたジョブが失敗したときに、キューワーカはFailingJob::handle
メソッドを実行していました。Laravel5.8では、FailingJob
クラスに含まれていたロジックは、ジョブクラス自身のfail
メソッドへそのまま移動されました。このため、Illuminate\Contracts\Queue\Job
契約へfail
メソッドが追加されました。
ベースのIlluminate\Queue\Jobs\Job
クラスがfail
の実装を含んでも、通常のアプリケーションコードではコードの変更は必要ありません。しかし、Laravelにより提供されているベースのジョブクラスを拡張しないで、ジョブクラスを活用するカスタムキュードライバを構築している場合は、カスタムジョブクラスへfail
メソッドを自分で実装する必要があります。実装の例として、Laravelのベースジョブクラスを参照してください。
この変更により、ジョブの削除過程をカスタムキュードライバがよりコントロールできるようになりました。
Redis Blocking Pop
影響の可能性: とても低い
Redisキュードライバの"blocking
pop"機能の使用が安全になりました。以前は、ジョブ再取得と同時にRedisサーバかワーカがクラッシュすると、キューされたジョブを失う機会が多少ありました。Blocking
popが安全になったため、各Laravelキューに対し新しいRedisは、:notify
サフィックス付けてリストします。
リクエスト
TransformsRequest
ミドルウェア
影響の可能性: 低い
Illuminate\Foundation\Http\Middleware\TransformsRequest
ミドルウェアのtransform
メソッドは、入力が配列のときに「完全な」リクエスト入力キーを受け入れるようになりました。
'employee' => [
'name' => 'Taylor Otwell',
],
/**
* 渡された値を変形する
*
* @param string $key
* @param mixed $value
* @return mixed
*/
protected function transform($key, $value)
{
dump($key); // 'employee.name' (Laravel5.8)
dump($key); // 'name' (Laravel5.7)
}
ルート
UrlGenerator
契約
影響の可能性: とても低い
previous
メソッドが、Illuminate\Contracts\Routing\UrlGenerator
契約へ追加されました。このインターフェイスを実装している場合は、メソッドを追加してください。
Illuminate\Routing\UrlGenerator
のcachedSchema
プロパティ
影響の可能性: とても低い
Laravel5.7
で非推奨になっていた、Illuminate\Routing\UrlGenerator
の$cachedSchema
プロパティ名が、$cachedScheme
へ変更されました。
セッション
StartSession
ミドルウェア
影響の可能性: とても低い
セッションの維持ロジックをterminate()
メソッドからhandle()
メソッドへ移動しました。これらのメソッドをオーバーライドしている場合は、この変更を反映するように更新してください。
サポート
ヘルパから文字列と配列クラスへ
影響の可能性: 中程度
すべてのarray_*
とstr_*
グローバルヘルパが、非推奨となりました。Illuminate\Support\Arr
とIlluminate\Support\Str
のメソッドを直接使用してください。
全ての配列と文字列のグローバル関数の後方互換性層を提供する、新しいlaravel/helpersパッケージへヘルパは移動されたため、この変更はmedium
と記載しました。
遅延サービスプロバイダ
影響の可能性: 中程度
プロバイダを遅延させるかどうかを示すための、サービスプロバイダのdefer
論理プロパティは、非推奨となりました。そのサービスプロバイダを遅延させるように指示するには、Illuminate\Contracts\Support\DeferrableProvider
契約を実装してください。
リードオンリーenv
ヘルパ
影響の可能性: 低い
以前のenv
ヘルパは、実行時に変更された環境変数から値を取得していました。Laravel5.8から、環境変数値が変わらないように取り扱います。実行時に環境変数を変更したい場合は、config
ヘルパを使い取得できる設定値の使用を考慮してください。
以前の振る舞い:
dump(env('APP_ENV')); // local
putenv('APP_ENV=staging');
dump(env('APP_ENV')); // staging
新しい振る舞い:
dump(env('APP_ENV')); // local
putenv('APP_ENV=staging');
dump(env('APP_ENV')); // local
テスト
setUp
とtearDown
メソッド
setUp
とtearDown
メソッドは、voidを返却タイプとして要求するようになりました。
protected function setUp(): void
protected function tearDown(): void
PHPUnit 8
影響の可能性: 状況による
Laravel5.8ではPHPUnit7をデフォルトで使用します。しかしながら、PHP7.2以上が必要なPHPUnit8へアップグレードする選択肢もあります。詳細は、PHPUnit8のリリースアナウンスメントの変更一覧へ一通り目を通してください。
バリデーション
Validator
契約
影響の可能性: とても低い
validated
メソッドが、Illuminate\Contracts\Validation\Validator
契約へ追加されました。
/**
* バリデートされた属性と値の取得
*
* @return array
*/
public function validated();
このインターフェイスを実装してる場合は、メソッドを追加してください。
ValidatesAttributes
トレイト
影響の可能性: とても低い
Illuminate\Validation\Concerns\ValidatesAttributes
トレイトのparseTable
、getQueryColumn
、requireParameterCount
メソッドをprotected
からpublic
に変更しました。
DatabasePresenceVerifier
クラス
影響の可能性: とても低い
Illuminate\Validation\DatabasePresenceVerifier
クラスのtable
メソッドをprotected
からpublic
に変更しました。
Validator
クラス
影響の可能性: とても低い
Illuminate\Validation\Validator
クラスのgetPresenceVerifierFor
メソッドをprotected
からpublic
に変更しました。
メールバリデーション
影響の可能性: とても低い
メールのバリデーションルールをメールがRFC6530準拠するかをチェックするようになりました。SwiftMailerが使用しているバリデーションロジックと統一しました。Laravel5.7
では、email
ルールはメールがRFC822を準拠しているかのみを検証していました。
これにより、Laravel5.8を使用すると以前は誤って有効でないと判断したメールを有効と判断するようになりました。(例:hej@bär.se
)一般的にはバグフィックスとして考えるべきでしょう。しかしながら、これは注意の必要な互換性のない変更としてリストされています。この変更により、問題が起きたらお知らせください。
ビュー
getData
メソッド
影響の可能性: とても低い
getData
メソッドが、Illuminate\Contracts\View\View
契約へ追加されました。このインターフェイスを実装している場合は、メソッドを追加してください。
通知
Nexmo/Slack通知チャンネル
影響の可能性: 高い
NexmoとSlackの通知チャンネルをファーストパーティパッケージとして独立させました。これらのチャンネルをアプリケーションで使用する場合は、以下のパッケージをインストールしてください。
composer require laravel/nexmo-notification-channel
composer require laravel/slack-notification-channel
その他
laravel/laravel
のGitHubリポジトリで、変更を確認することをおすすめします。これらの変更は必須ではありませんが、皆さんのアプリケーションではファイルの同期を保つほうが良いでしょう。変更のいくつかは、このアップグレードガイドで取り扱っていますが、設定ファイルやコメントなどの変更は取り扱っていません。変更は簡単にGitHubの比較ツールで閲覧でき、みなさんにとって重要な変更を選択できます。