重要度の高い変更High Impact Changes
重要度が中程度の変更Medium Impact Changes
5.8から6.0へのアップグレードUpgrading To 6.0 From 5.8
アップグレード見積もり時間:1時間Estimated Upgrade Time: One Hour
Note: {note} We attempt to document every possible breaking change. Since some of these breaking changes are in obscure parts of the framework only a portion of these changes may actually affect your application.
私達は、互換性を失う可能性がある変更を全部ドキュメントにしようとしています。しかし、変更点のいくつかは、フレームワークの明確ではない部分で行われているため、一部の変更が実際にアプリケーションに影響を与えてしまう可能性があります。
動作要件:PHP7.2PHP 7.2 Required
影響の可能性: 中程度Likelihood Of Impact: Medium
PHP7.1は2019年12月に積極的にメンテナンスされなくなっています。そのため、Laravel6.0はPHP7.2以上を動作要件とします。PHP 7.1 will no longer be actively maintained as of December 2019. Therefore, Laravel 6.0 requires PHP 7.2 or greater.
依存パッケージのアップデートUpdating Dependencies
composer.json
ファイル中のlaravel/framework
指定を^6.0
に更新してください。Update your laravel/framework
dependency to ^6.0
in your composer.json
file.
次に、アプリケーションで使用しているサードパーティパッケージを調べ、Laravel6をサポートする適切なバージョンを使用しているか確認してください。Next, examine any 3rd party packages consumed by your application and verify you are using the proper version for Laravel 6 support.
認可Authorization
認可リソースとviewAny
Authorized Resources & viewAny
影響の可能性: 高いLikelihood Of Impact: High
authorizeResource
メソッドを用いてコントラーへ付加している認可ポリシーは、viewAny
メソッドを定義する必要があります。コントローラのindex
メソッドへユーザーがアクセスする時に呼び出されます。定義しない場合は非認可扱いとなり、コントローラのindex
メソッドへの呼び出しは拒否されます。Authorization policies attached to controllers using the authorizeResource
method should now define a viewAny
method, which will be called when a user accesses the controller's index
method. Otherwise, calls to the index
method of the controller will be rejected as unauthorized.
認可レスポンスAuthorization Responses
影響の可能性: 低いLikelihood Of Impact: Low
Illuminate\Auth\Access\Response
クラスのコンストラクタの使用法を変更しました。適宜更新してください。認可レスポンスを自力で構築しておらず、ポリシーのallow
とdeny
インスタンスメソッドだけを使用しているなら、変更の必要はありません。The constructor signature of the Illuminate\Auth\Access\Response
class has changed. You should update your code accordingly. If you are not constructing authorization responses manually and are only using the allow
and deny
instance methods within your policies, no change is required:
/**
* 新しいレスポンスの生成
*
* @param bool $allowed
* @param string $message
* @param mixed $code
* @return void
*/
public function __construct($allowed, $message = '', $code = null)
「Deny」レスポンスを返すReturning "Deny" Responses
影響の可能性: 低いLikelihood Of Impact: Low
以前のリリースのLaravelでは即時に例外が投げられるため、ポリシーメソッドからdeny
メソッドの値を返す必要はありませんでした。しかしながら現在はLaravelのドキュメント通りに、ポリシーからdeny
メソッドの値を返す必要があります。In previous releases of Laravel, you did not need to return the value of the deny
method from your policy methods since an exception was thrown immediately. However, in accordance with the Laravel documentation, you must now return the value of the deny
method from your policies:
public function update(User $user, Post $post)
{
if (! $user->role->isEditor()) {
return $this->deny("You must be an editor to edit this post.")
}
return $user->id === $post->user_id;
}
Illuminate\Contracts\Auth\Access\Gate
契約The Illuminate\Contracts\Auth\Access\Gate
Contract
影響の可能性: 低いLikelihood Of Impact: Low
Illuminate\Contracts\Auth\Access\Gate
契約は、新しくinspect
メソッドを追加しました。自力でこのインターフェイスを実装している場合は、このメソッドを実装へ加えてください。The Illuminate\Contracts\Auth\Access\Gate
contract has received a new inspect
method. If you are implementing this interface manually, you should add this method to your implementation.
CarbonCarbon
Carbon 1.xのサポート停止Carbon 1.x No Longer Supported
影響の可能性: 中程度Likelihood Of Impact: Medium
Carbon 1.xのメンテナンス切れが近づいて来たため、サポートを停止しました。Carbon2.0を使用するようにアプリケーションをアップグレードしてください。Carbon 1.x is no longer supported[https://github.com/laravel/framework/pull/28683] since it is nearing its maintenance end of life. Please upgrade your application to Carbon 2.0.
設定Configuration
AWS_REGION
環境変数The AWS_REGION
Environment Variable
影響の可能性: 状況によるLikelihood Of Impact: Optional
Laravel Vaporを利用する計画がある場合は、config
ディレクトリ中のファイルのすべてのAWS_REGION
出現箇所をAWS_DEFAULT_REGION
へ更新してください。さらに、この環境変数の名前を.env
ファイルに含めてください。If you plan to utilize Laravel Vapor[https://vapor.laravel.com], you should update all occurrences of AWS_REGION
within your config
directory to AWS_DEFAULT_REGION
. In addition, you should update this environment variable's name in your .env
file.
RedisデフォルトクライアントRedis Default Client
影響の可能性: 中程度Likelihood Of Impact: Medium
デフォルトのRedisクライアントをpredis
からphpredis
へ変更しました。predis
を使い続けるには、config/database.php
設定ファイルのredis.client
設定オプションをpredis
に指定してください。The default Redis client has changed from predis
to phpredis
. In order to keep using predis
, ensure the redis.client
configuration option is set to predis
in your config/database.php
configuration file.
DynamoDBキャッシュ保存DynamoDB Cache Store
影響の可能性: 条件によるLikelihood Of Impact: Optional
Laravel Vaporの使用を計画している場合は、config/cache.php
ファイルにdynamodb
保存のオプションを含むように変更してください。If you plan to utilize Laravel Vapor[https://vapor.laravel.com], you should update your config/cache.php
file to include the dynamodb
store.
<?php
return [
...
'stores' => [
...
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'),
],
],
...
];
SQS環境変数SQS Environment Variables
影響の可能性: 条件によるLikelihood Of Impact: Optional
Laravel Vaporの使用を計画している場合は、config/queue.php
ファイルにsqs
接続の環境変数オプションを含むように変更してください。If you plan to utilize Laravel Vapor[https://vapor.laravel.com], you should update your config/queue.php
file to include the updated sqs
connection environment variables.
<?php
return [
...
'connections' => [
...
'sqs' => [
'driver' => 'sqs',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
'queue' => env('SQS_QUEUE', 'your-queue-name'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
],
...
];
データベースDatabase
Capsule::table
メソッドThe Capsule table
Method
影響の可能性: 中程度Likelihood Of Impact: Medium
Note:
この変更はilluminate/database
を依存パッケージとして使用している、Laravel以外のアプリケーションに適用されます。{note} This change only applies to non-Laravel applications that are usingilluminate/database
as a dependency.
Illuminate\Database\Capsule\Manager
クラスのtable
メソッド使用方法が変更され、
第2引数にテーブルのエイリアスを受け取るようにしました。Laravelアプリケーション外で、illuminate/database
を使用している場合は、このメソッドの呼び出しを適切に更新してください。
/**
* fluentクエリビルダの取得
*
* @param \Closure|\Illuminate\Database\Query\Builder|string $table
* @param string|null $as
* @param string|null $connection
* @return \Illuminate\Database\Query\Builder
*/
public static function table($table, $as = null, $connection = null)
cursor
メソッドThe cursor
Method
影響の可能性: 低いLikelihood Of Impact: Low
cursor
メソッドがGenerator
インスタンスの代わりに、Illuminate\Support\LazyCollection
インスタンスを返すようにしました。LazyCollection
もジェネレータ同様に繰り返し処理できます。The cursor
method now returns an instance of Illuminate\Support\LazyCollection
instead of a Generator
The LazyCollection
may be iterated just like a generator:
$users = App\User::cursor();
foreach ($users as $user) {
//
}
EloquentEloquent
BelongsTo::update
メソッドThe BelongsTo::update
Method
影響の可能性: 中程度Likelihood Of Impact: Medium
一貫性を取るため、BelongsTo
リレーションのupdate
メソッドは、アドホックな更新クエリとして機能するようにしました。つまり、複数代入の保護やEloquentイベントの発行を行わなくなりました。これにより、他のタイプのリレーションのupdate
メソッドと一貫性が取れました。For consistency, the update
method of the BelongsTo
relationship now functions as an ad-hoc update query, meaning it does not provide mass assignment protection or fire Eloquent events. This makes the relationship consistent with the update
methods on all other types of relationships.
BelongsTo
リレーションを通じて所属しているモデルを更新し、複数代入更新の保護とイベントを受け取りたい場合は、モデル自身のupdate
メソッドを呼び出してください。If you would like to update a model attached via a BelongsTo
relationship and receive mass assignment update protection and events, you should call the update
method on the model itself:
// アドホッククエリ、複数代入保護やイベントはない
$post->user()->update(['foo' => 'bar']);
// モデルの更新、複数代入保護とイベントは提供される
$post->user->update(['foo' => 'bar']);
ArrayableとtoArray
Arrayable & toArray
影響の可能性: 中程度Likelihood Of Impact: Medium
EloquentモデルのtoArray
メソッドは、Illuminate\Contracts\Support\Arrayable
を実装している属性を全部配列へキャストするようにしました。The Eloquent model's toArray
method will now cast any attributes that implement Illuminate\Contracts\Support\Arrayable
to an array.
主キータイプの宣言Declaration Of Primary Key Type
影響の可能性: 中程度Likelihood Of Impact: Medium
Laravel6.0では、整数キータイプに対するパフォーマンスの最適化を行いました。モデルの主キーに文字列を使用してる場合は、モデル上の$keyType
プロパティを使い、キータイプを宣言する必要があります。Laravel 6.0 has received performance optimizations[https://github.com/laravel/framework/pull/28153] for integer key types. If you are using a string as your model's primary key, you should declare the key type using the $keyType
property on your model:
/**
* 主キーの「タイプ」
*
* @var string
*/
protected $keyType = 'string';
メール確認Email Verification
再送信確認ルートのHTTPメソッドResend Verification Route HTTP Method
影響の可能性: 中程度Likelihood Of Impact: Medium
CSRF攻撃の可能性を防ぐため、Laravelの組み込みメール確認を利用する場合に、ルータに登録されるemail/resend
ルートは、GET
からPOST
へメソッドを変更しました。そのため、このルートに対して正しいリクエストタイプを送るように、フロントエンドを更新する必要があります。たとえば、組み込みのメール確認テンプレートのスカフォールドを使用している場合は、次のようになります。To prevent possible CSRF attacks, the email/resend
route registered by the router when using Laravel's built-in email verification has been updated from a GET
route to a POST
route. Therefore, you will need to update your frontend to send the proper request type to this route. For example, if you are using the built-in email verification template scaffolding:
{{ __('Before proceeding, please check your email for a verification link.') }}
{{ __('If you did not receive the email') }},
<form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
@csrf
<button type="submit" class="btn btn-link p-0 m-0 align-baseline">
{{ __('click here to request another') }}
</button>.
</form>
MustVerifyEmail
契約The MustVerifyEmail
Contract
影響の可能性: 低いLikelihood Of Impact: Low
Illuminate\Contracts\Auth\MustVerifyEmail
契約へ新たに、getEmailForVerification
メソッドを追加しました。この契約を自分で実装している場合は、このメソッドを実装してください。このメソッドはオブジェクトに関連したメールアドレスを返します。App\User
モデルでIlluminate\Auth\MustVerifyEmail
トレイトを使用している場合は、このトレイトの実装でメソッドを実装しているため、必要な変更はありません。A new getEmailForVerification
method has been added to the Illuminate\Contracts\Auth\MustVerifyEmail
contract. If you are manually implementing this contract, you should implement this method. This method should return the object's associated email address. If your App\User
model is using the Illuminate\Auth\MustVerifyEmail
trait, no changes are required, as this trait implements this method for you.
メール確認ルートの変更Email Verification Route Change
影響の可能性: 中程度Likelihood Of Impact: Medium
メール確認ルートは/email/verify/{id}
から/email/verify/{id}/{hash}
へ変更しました。Laravel6.xへアップグレードする前のバージョンから送信されたメール確認メールは無効になり、404ページが表示されます。望むのであれば、古い認証のURLパスに合うルートを定義し、ユーザーへメールアドレスを再ベリファイするように情報メッセージを表示しましょう。The route path for verifying emails has changed from /email/verify/{id}
to /email/verify/{id}/{hash}
. Any email verification emails that were sent prior to upgrading to Laravel 6.x will not longer be valid and will display a 404 page. If you wish, you may define a route matching the old verification URL path and display an informative message for your users that asks them to re-verify their email address.
ヘルパHelpers
文字列と配列のヘルパパッケージString & Array Helpers Package
影響の可能性: 高いLikelihood Of Impact: High
すべてのstr_
とarray_
ヘルパは新しいlaravel/helpers
Composerパッケージに移され、フレームワークから削除しました。望みであればこれらのヘルパの呼び出しすべてで、Illuminate\Support\Str
とIlluminate\Support\Arr
クラスを使ってください。もしくは、アプリケーションへ新たにlaravel/helpers
パッケージを追加すれば、こうしたヘルパを今までどおり利用できます。All str_
and array_
helpers have been moved to the new laravel/helpers
Composer package and removed from the framework. If desired, you may update all calls to these helpers to use the Illuminate\Support\Str
and Illuminate\Support\Arr
classes. Alternatively, you can add the new laravel/helpers
package to your application to continue using these helpers:
composer require laravel/helpers
多言語化Localization
Lang::trans
とLang::transChoice
メソッドThe Lang::trans
& Lang::transChoice
Methods
影響の可能性: 中程度Likelihood Of Impact: Medium
トランスレータのLang::trans
とLang::transChoice
メソッドは、Lang::get
とLang::choice
へリネームしました。The Lang::trans
and Lang::transChoice
methods of the translator have been renamed to Lang::get
and Lang::choice
.
さらに、Illuminate\Contracts\Translation\Translator
契約を自分で実装している場合は、その実装のtrans
とtransChoice
をget
とchoice
へ更新してください。In addition, if you are manually implementing the Illuminate\Contracts\Translation\Translator
contract, you should update your implementation's trans
and transChoice
methods to get
and choice
.
Lang::getFromJson
メソッドThe Lang::getFromJson
Method
影響の可能性: 中程度Likelihood Of Impact: Medium
Lang::get
とLang::getFromJson
メソッドはまとめました。Lang::getFromJson
メソッドの呼び出しは、Lang::get
を呼び出すように更新してください。The Lang::get
and Lang::getFromJson
methods have been consolidated. Calls to the Lang::getFromJson
method should be updated to call Lang::get
.
Note:
Lang::transChoice
、Lang::trans
、Lang::getFromJson
の削除に関連するBladeエラーを防ぐために、php artisan view:clear
Artisanコマンドを実行すべきでしょう。{note} You should run thephp artisan view:clear
Artisan command to avoid Blade errors related to the removal ofLang::transChoice
,Lang::trans
, andLang::getFromJson
.
メールMail
MandrillとSparkPostドライバの削除Mandrill & SparkPost Drivers Removed
影響の可能性: 低いLikelihood Of Impact: Low
mandrill
とsparkpost
メールドライバは削除しました。続けてどちらかのドライバを使用したい場合は、そうしたドライバを提供するコミュニティによりメンテナンスされているパッケージを選び、採用することを推奨します。The mandrill
and sparkpost
mail drivers have been removed. If you would like to continue using either of these drivers, we encourage you to adopt a community maintained package of your choice that provides the driver.
通知Notifications
Nexmoルーティングの削除Nexmo Routing Removed
影響の可能性: 低いLikelihood Of Impact: Low
しばらく残していましたが、フレームワークのコアからNexmo通知チャンネルを削除しました。Nexmo通知を利用していた方は、ドキュメントで説明している通りに、Notifiableエンティティに自分で実装してください。A lingering part of the Nexmo notification channel was removed from the core of the framework. If you're relying on routing Nexmo notifications you should manually implement the routeNotificationForNexmo
method on your notifiable entity as described in the documentation[/docs/{{version}}/notifications#routing-sms-notifications].
パスワードリセットPassword Reset
パスワードの検証Password Validation
影響の可能性: 低いLikelihood Of Impact: Low
PasswordBroker
はパスワードの制限やバリデーションを行わなくしました。パスワードのバリデーションはすでにResetPasswordController
クラスで行っており、ブローカのバリデーションは冗長でカスタマイズ不可能でした。PasswordBroker
(もしくはPassword
ファサード)を組み込まれているResetPasswordController
以外で使用している場合は、ブローカへ渡す前にすべてのパスワードをバリデートする必要があります。The PasswordBroker
no longer restricts or validates passwords. Password validation was already being handled by the ResetPasswordController
class, making the broker's validations redundant and impossible to customize. If you are manually using the PasswordBroker
(or Password
facade) outside of the built-in ResetPasswordController
, you should validate all passwords before passing them to the broker.
キューQueues
キュー試行回数制限Queue Retry Limit
影響の可能性: 中程度Likelihood Of Impact: Medium
以前のリリースのLaravelは、php artisan queue:work
コマンドは無制限にジョブを再試行していました。Laravel6.0からこのコマンドは、デフォルトで1回試行します。強制的に無制限回試行したい場合は、--tries
オプションに0
を指定してください。In previous releases of Laravel, the php artisan queue:work
command would retry jobs indefinitely. Beginning with Laravel 6.0, this command will now try a job one time by default. If you would like to force jobs to be tried indefinitely, you may pass 0
to the --tries
option:
php artisan queue:work --tries=0
さらに付け加え、アプリケーションのデータベースへ確実にfailed_jobs
テーブルを持たせてください。このテーブルのマイグレーションは、queue:failed-table
Artisanコマンドで生成できます。In addition, please ensure your application's database contains a failed_jobs
table. You can generate a migration for this table using the queue:failed-table
Artisan command:
php artisan queue:failed-table
リクエストRequests
Input
ファサードThe Input
Facade
影響の可能性: 中程度Likelihood Of Impact: Medium
Input
ファサードは基本的にRequest
ファサードの重複でしたが、削除しました。Input::get
メソッドを使用していた場合、Request::input
メソッドを使ってください。他のInput
ファサードの呼び出しも、シンプルにRequest
ファサードの使用へ更新できます。The Input
facade, which was primarily a duplicate of the Request
facade, has been removed. If you are using the Input::get
method, you should now call the Request::input
method. All other calls to the Input
facade may simply be updated to use the Request
facade.
スケジュールScheduling
between
メソッドThe between
Method
影響の可能性: 低いLikelihood Of Impact: Low
以前のリリースのLaravelでは、スケジューラのbetween
メソッドは日付の境界に関して混乱をもたらす動作をしていました。例をご覧ください。In previous releases of Laravel, the scheduler's between
method exhibited confusing behavior across date boundaries. For example:
$schedule->command('list')->between('23:00', '4:00');
ほとんどのユーザーは、このメソッドは23:00から4:00までの間の毎分、list
コマンドを実行すると期待するでしょう。しかしながら、以前のLaravelのリリースでは、スケジューラは時間を入れ替えて、4:00から23:00までの毎分list
コマンドを実行していました。Laravel6.0では期待通りに動作します。For most users, the expected behavior of this method would be to run the list
command every minute for all minutes between 23:00 and 4:00. However, in previous releases of Laravel, the scheduler ran the list
command every minute between 4:00 and 23:00, essentially swapping the time thresholds. In Laravel 6.0, this behavior has been corrected.
ストレージStorage
Rackspaceストレージドライバの削除Rackspace Storage Driver Removed
影響の可能性: 低いLikelihood Of Impact: Low
rackspace
ストレージドライバを削除しました。Rackspaceをストレージプロバイダとして使い続けたい場合は、このドライバを提供するコミュニティがメンテナンスしているパッケージを採用することを推奨します。The rackspace
storage driver has been removed. If you would like to continue using Rackspace as a storage provider, we encourage you to adopt a community maintained package of your choice that provides this driver.
URL生成URL Generation
ルートURLジェネレータと追加のパラメータRoute URL Generation & Extra Parameters
以前のリリースのLaravelでは、route
ヘルパやURL::route
メソッドへ連想配列のパラメータを渡した場合、パラメータの値にルートパスと一致するキーがない場合であってもルートへのURLを生成する場合、まれにパラメータをURI値として使用していました。Laravel6.0からは、こうした値は代わりにクエリ文字列として付け加えます。例として、以下のルートを考えてください。In previous releases of Laravel, passing associative array parameters to the route
helper or URL::route
method would occasionally use these parameters as URI values when generating URLs for routes, even if the parameter value had no matching key within the route path. Beginning in Laravel 6.0, these values will be attached to the query string instead. For example, consider the following route:
Route::get('/profile/{location}', function ($location = null) {
//
})->name('profile');
// Laravel5.8: http://example.com/profile/active
echo route('profile', ['status' => 'active']);
// Laravel6.0: http://example.com/profile?status=active
echo route('profile', ['status' => 'active']);
action
ヘルパとURL::action
メソッドもこの変更の影響を受けます。The action
helper and URL::action
method are also affected by this change:
Route::get('/profile/{id}', 'ProfileController@show');
// Laravel5.8: http://example.com/profile/1
echo action('ProfileController@show', ['profile' => 1]);
// Laravel6.0: http://example.com/profile?profile=1
echo action('ProfileController@show', ['profile' => 1]);
バリデーションValidation
FormRequestのvalidationData
メソッドFormRequest validationData
Method
影響の可能性: 低いLikelihood Of Impact: Low
リクエストのvalidationData
メソッドをprotected
からpublic
へ変更しました。皆さんの実装でこのメソッドをオーバーライドしている場合は、public
の可視性へ変更してください。The form request's validationData
method was changed from protected
to public
. If you are overriding this method in your implementation, you should update the visibility to public
.
その他Miscellaneous
laravel/laravel
のGitHubリポジトリで、変更を確認することを推奨します。これらの変更は必須でありませんが、皆さんのアプリケーションではファイルの同期を保つほうが良いでしょう。変更のいくつかは、このアップグレードガイドで取り扱っていますが、設定ファイルやコメントなどの変更は取り扱っていません。変更は簡単にGitHubの比較ツールで閲覧でき、みなさんにとって重要な変更を選択できます。We also encourage you to view the changes in the laravel/laravel
GitHub repository[https://github.com/laravel/laravel]. While many of these changes are not required, you may wish to keep these files in sync with your application. Some of these changes will be covered in this upgrade guide, but others, such as changes to configuration files or comments, will not be. You can easily view the changes with the GitHub comparison tool[https://github.com/laravel/laravel/compare/5.8...6.x] and choose which updates are important to you.