5.6から5.7.0へのアップグレード
アップグレード時間の見積もり:10分から15分
Note: 私達は、互換性を失う可能性がある変更を全部ドキュメントにしようとしています。しかし、変更点のいくつかは、フレームワークの明確ではない部分で行われているため、一部の変更が実際にアプリケーションに影響を与えてしまう可能性があります。
依存パッケージのアップデート
composer.json
ファイル中の、laravel/framework
依存指定を5.7.*
へアップデートしてください。
Laravel
Passportを使用している場合は、composer.json
ファイルのlaravel/passport
依存指定を^7.0
へアップデートしてください。
次に、皆さんのアプリケーションで使用しているサードパーティのパッケージを確認し、Laravel5.7をサポートするバージョンを使用しているのをチェックしてください。
アプリケーション
register
メソッド
影響の可能性: とても低い
Illuminate\Foundation\Application
クラスの未使用なoptions
引数が削除されました。このメソッドをオーバーライドしている場合、メソッドの引数を更新してください。
/**
* アプリケーションのサービスプロバイダの登録
*
* @param \Illuminate\Support\ServiceProvider|string $provider
* @param bool $force
* @return \Illuminate\Support\ServiceProvider
*/
public function register($provider, $force = false);
Artisan
スケジュール済みのジョブの接続とキュー
影響の可能性: 低い
$schedule->job
メソッドは、job
メソッドで接続/ジョブが明確に渡されていない場合、ジョブクラスのqueue
とconnection
プロパティの値が利用されるようになりました。
通常、これはバグフィックスと考えられています。しかしながら、不注意によるブレイキングチェンジとしてリストアップされています。この変更により、問題に遭遇した場合は、お知らせください。
Assets
Assetディレクトリの非階層化
影響の可能性: なし
新しいLaravel5.7アプリケーションでは、スクリプトとスタイルを含んでいたassetsディレクトリは削除され、スクリプトとスタイルはresources
ディレクトリへ移動しました。これは既存のアプリケーションに影響しませんし、既存のアプリケーションを更新する必要はありません。
しかし、この変更を適用したければ、resources/assets/*
下の全てのファイル/ディレクトリを一つ上の階層へ移動してください。
resources/assets/js/*
をresources/js/*
へ移動resources/assets/sass/*
をresources/sass/*
へ移動
それから、webpack.mix.js
ファイル中の、古いディレクトリの参照を更新します。
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css');
svg
ディレクトリの追加
影響の可能性: とても高い
public
ディレクトリへ、新しくsvg
ディレクトリが追加されました。その中に名前が示すエラーページを表示するための、403.svg
、404.svg
、500.svg
、503.svg
のsvgファイルを含んでいます。
GitHubから、これらのファイルを取得できます。
認証
Authenticate
ミドルウェア
影響の可能性: 低い
Illuminate\Auth\Middleware\Authenticate
ミドルウェアのauthenticate
メソッドは、最初の引数として送信されてきた$request
を受け取るようになりました。皆さんのAuthenticate
ミドルウェアの中で、このメソッドをオーバーライドしてる場合は、ミドルウェアの引数を更新してください。
/**
* Determine if the user is logged in to any of the given guards.
*
* @param \Illuminate\Http\Request $request
* @param array $guards
* @return void
*
* @throws \Illuminate\Auth\AuthenticationException
*/
protected function authenticate($request, array $guards)
ResetsPasswords
トレイト
影響の可能性: 低い
ResetsPasswords
トレイトのprotected
sendResetResponse
メソッドは、最初の引数として送信されてきたIlluminate\Http\Request
を受け取るようになりました。このメソッドをオーバーライドしている場合、皆さんのメソッドの引数を更新してください。
/**
* Get the response for a successful password reset.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetResponse(Request $request, $response)
SendsPasswordResetEmails
トレイト
影響の可能性: 低い
SendsPasswordResetEmails
トレイトのsendResetLinkResponse
protectedメソッドは、最初の引数として送信されてきたIlluminate\Http\Request
を受け取るようになりました。このメソッドをオーバーライドしている場合、皆さんのメソッドの引数を更新してください。
/**
* Get the response for a successful password reset link.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetLinkResponse(Request $request, $response)
認可
Gate
影響の可能性: とても低い
raw
メソッドは可視性をprotected
からpublic
に変更しました。それに付け加え、Illuminate\Contracts\Auth\Access\Gate
契約に追加されました。
/**
* Get the raw result from the authorization callback.
*
* @param string $ability
* @param array|mixed $arguments
* @return mixed
*/
public function raw($ability, $arguments = []);
このインターフェイスを実装してる場合は、メソッドを皆さんの実装へ追加してください。
Login
イベント
影響の可能性: とても低い
Illuminate\Auth\Events\Login
の__construct
メソッドに、新しく$guard
引数が追加されました。
/**
* 新しいイベントインスタンスの生成
*
* @param string $guard
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param bool $remember
* @return void
*/
public function __construct($guard, $user, $remember)
アプリケーションの中で、このイベントを独自にディスパッチしている場合は、イベントのコンストラクタへこの新しい引数を渡す必要があります。以下の例では、フレームワークデフォルトのガードをログインイベントへ渡しています。
use Illuminate\Auth\Events\Login;
event(new Login(config('auth.defaults.guard'), $user, $remember))
Blade
or
操作子
影響の可能性: 高い
同じ目的・機能の??
PHP組み込み「null合体」演算子の優位性により、Bladeの"or"演算子を削除しました。
// Laravel 5.6
{{ $foo or 'default' }}
// Laravel 5.7
{{ $foo ?? 'default' }}
Cache
影響の可能性: とても高い
新しくdata
ディレクトリがstorage/framework/cache
へ追加されました。このディレクトリをアプリケーションに作成してください。
mkdir -p storage/framework/cache/data
次に、新しく作成したdata
ディレクトリへ、.gitignoreファイルを追加してください。
cp storage/framework/cache/.gitignore storage/framework/cache/data/.gitignore
最後にstorage/framework/cache/.gitignoreファイルを以下のように確実に更新してください。
*
!data/
!.gitignore
Carbon
影響の可能性: とても低い
Carbonの「マクロ」は、Laravelのライブラリの拡張に代わり、直接Carbonライブラリにより処理されるようになりました。この変更に関連する問題に気づいたら、お知らせください。
コレクション
split
メソッド
影響の可能性: 低い
split
メソッドは、オリジナルコレクション中の総アイテム数が、リクエストされたコレクション数より少なくない限り、「グループ」のリクエストした数を常に返すように更新されました一般的にはこれはバグフィックスとして考えられています。しかし、不注意によるブレイキングチェンジとしてリストアップされています。
クッキー
Factory
契約のメソッド使用法
影響の可能性: とても低い
Illuminate\Contracts\Cookie\Factory
インターフェイスの
make
とforever
メソッドの使い方が、変更されました。このインターフェイスを実装している場合は、これらのメソッドを更新してください。
データベース
softDeletesTz
マイグレーションメソッド
影響の可能性: 低い
スキーマテーブルビルダのsoftDeletesTz
メソッドは、第1引数にカラム名を受け取るようになりました。それにより、$precision
は第2引数となりました。
/**
* Add a "deleted at" timestampTz for the table.
*
* @param string $column
* @param int $precision
* @return \Illuminate\Support\Fluent
*/
public function softDeletesTz($column = 'deleted_at', $precision = 0)
ConnectionInterface
契約
影響の可能性: とても低い
新しく$useReadPdo
引数を追加したため、Illuminate\Contracts\Database\ConnectionInterface
契約は、select
and selectOne
の引数が更新されました。
/**
* Run a select statement and return a single result.
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return mixed
*/
public function selectOne($query, $bindings = [], $useReadPdo = true);
/**
* Run a select statement against the database.
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return array
*/
public function select($query, $bindings = [], $useReadPdo = true);
それに付け加え、この契約にcursor
メソッドが追加されました。
/**
* Run a select statement against the database and returns a generator.
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return \Generator
*/
public function cursor($query, $bindings = [], $useReadPdo = true);
このインターフェイスを実装している場合、このメソッドを追加してください。
マイグレーションコマンド出力
影響の可能性: とても低い
コアのマイグレーションコマンドは、マイグレータクラスの出力インスタンスをセットするように更新されました。既存のマイグレーションコマンドをオーバーライドしている場合は、$this->migrator->getNotes()
の参照を削除し、代わりに$this->migrator->setOutput($this->output)
を使用してください。
SQL Serverドライバプライオリティ
影響の可能性: 低い
Laravel5.7より前は、デフォルトSQL Server
PDOドライバとして、PDO_DBLIB
ドライバが使用されていました。このドライバは、Microsoftにより非推奨とされています。Laravel5.7では、利用可能であればPDO_SQLSRV
をデフォルトドライバとして利用します。別の選択として、PDO_ODBC
ドライバの使用も選べます。
'sqlsrv' => [
// ...
'odbc' => true,
'odbc_datasource_name' => 'your-odbc-dsn',
],
どちらのドライバも利用可能でない場合、LaravelはPDO_DBLIB
ドライバを使用します。
SQLite外部キー
影響の可能性: 中程度
SQLiteは外部キーのドロップをサポートしていません。そのため、テーブルに対するdropForeign
メソッドを使用すると例外が投げられるようになりました。一般的にはこれはバグフィックスとして考えられています。しかし、不注意によるブレイキングチェンジとしてリストアップされています。
複数のタイプのデータベースでマイグレーションを実行する場合、SQLiteの外部キー非サポートを避けるために、マイグレーションでのDB::getDriverName()
使用を考慮してください。
デバッグ
ダンパクラス
影響の可能性: とても低い
Symfonyのネイティブな変数ダンパである、Symfony\Component\VarDumper\VarDumper
とSymfony\Component\VarDumper\Dumper\HtmlDumper
を使用する利点により、Illuminate\Support\Debug\Dumper
とIlluminate\Support\Debug\HtmlDumper
クラスは削除されました。
Eloquent
latest
/oldest
メソッド
影響の可能性: 低い
Eloquentクエリビルダのlatest
とoldest
メソッドは、Eloquentモデルに指定されたカスタム"created
at"タイムスタンプカラムを尊重するようにアップデートされました。一般的にはこれはバグフィックスとして考えられています。しかし、不注意によるブレイキングチェンジとしてリストアップされています。
wasChanged
メソッド
影響の可能性: とても低い
Eloquentモデルの変更は、updated
モデルイベントが発行される前に、wasChanged
メソッドが利用可能になったことです。一般的にはこれはバグフィックスとして考えられています。しかし、不注意によるブレイキングチェンジとしてリストアップされています。この変更による問題に遭遇した場合は、お知らせください。
PostgreSQL特殊実数値
影響の可能性: 低い
PostgreSQLでは、実数値としてInfinity
、-Infinity
、NaN
をサポートしています。Laravel5.7より前のバージョンでは、Eloquentのキャストタイプがfloat
、double
、real
の場合、0
へキャストされていました。
Laravel5.7では、これらの値は対応するPHP定数、INF
、-INF
、NAN
へキャストされます。
メール確認
影響の可能性: 状況による
Laravelの新しいメール確認サービスを使用する選択をした場合、アプリケーションへスカフォールドを追加する必要があります。最初に、アプリケーションへVerificationController
を追加します。App\Http\Controllers\Auth\VerificationController。
さらに、App\User
モデルにMustVerifyEmail
契約を実装する必要があります。
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
// ...
}
検査済みのユーザーだけに特定のルートへのアクセスを許すためにverified
ミドルウェアを使うためには、app/Http/Kernel.php
ファイルの$routeMiddleware
プロパティへ、新しいミドルウェアを含めるために更新する必要があります。
// App\Http\Kernelクラスの中
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
さらに、確認ビュースタブが必要です。このビューは、resources/views/auth/verify.blade.php
として設置します。ビューの中身は、GitHubで取得できます。
次に、メールアドレスが確認された日時を保存するための、email_verified_at
カラムをユーザーテーブルへ追加します。
$table->timestamp('email_verified_at')->nullable();
ユーザー登録時にメールを送信するには、App\Providers\EventServiceProviderクラスへ、以下のイベントとリスナを登録する必要があります。
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
最後に、Auth::routes
メソッドを呼び出す時に、verify
オプションを渡してください。
Auth::routes(['verify' => true]);
ファイルシステム
Filesystem
契約メソッド
影響の可能性: 低い
readStream
とwriteStream
メソッドが、Illuminate\Contracts\Filesystem\Filesystem
契約へ追加されました。このインターフェイスを実装している場合、皆さんの実装へこれらのメソッドを追加してください。
ハッシュ
Hash::check
メソッド
影響の可能性: なし
check
メソッドは、設定されたアルゴリズムとハッシュのアルゴリズムがマッチするかをオプションとしてチェックするようになりました。
メール
Mailable動的変数のケース
影響の可能性: 低い
動的なビュー変数とMailable動的変数の振る舞いを統一するため、Mailableビューへ動的に渡される変数は、自動的に「キャメルケース」になるようになりました。動的Mailable変数はLaravelの機能としてドキュメントに乗せていないため、アプリケーションに影響する可能性は低いでしょう。
テンプレートテーマ
影響の可能性: 中程度
Markdownのmailableテンプレートのためのデフォルトテーマスタイルをカスタマイズしている場合、再公開(publish)し、カスタマイズし直す必要があります。'blue'、'green'、'red'のボタン色クラスが、'primary'、'success'、'error'へリネームされました。
キュー
QUEUE_DRIVER
環境変数
影響の可能性: とても低い
QUEUE_DRIVER
環境変数は、QUEUE_CONNECTION
へリネームされました。意図的に皆さんのconfig/queue.php
設定ファイルをLaravel5.7の内容へ合わせようとしない限り、アップグレードしている既存のアプリケーションには影響ありません。
WorkCommand
オプション
影響の可能性: とても低い
WorkCommand
へstop-when-empty
オプションが追加されました。このコマンドを拡張している場合は、クラスの$signature
プロパティへstop-when-empty
を追加する必要があります。
ルート
Route::redirect
メソッド
影響の可能性: 高い
Route::redirect
メソッドは、302
HTTPステータスコードを返すようになりました。301
リダイレクションを行う、permanentRedirect
メソッドが追加されました。
// Return a 302 redirect...
Route::redirect('/foo', '/bar');
// Return a 301 redirect...
Route::redirect('/foo', '/bar', 301);
// Return a 301 redirect...
Route::permanentRedirect('/foo', '/bar');
addRoute
メソッド
影響の可能性: 低い
Illuminate\Routing\Router
クラスのaddRoute
メソッドが、protected
からpublic
へ変更になりました。
バリデーション
ネストしたバリデーションデータ
影響の可能性: 中程度
以前のバージョンのLaravelでは、validate
はネストしたバリデーションルールに対して、正しいデータを返しませんでした。Laravel5.7では、修正されています。
$data = Validator::make([
'person' => [
'name' => 'Taylor',
'job' => 'Developer'
]
], ['person.name' => 'required'])->validate();
dump($data);
// 以前の振る舞い
['person' => ['name' => 'Taylor', 'job' => 'Developer']]
// 新しい振る舞い
['person' => ['name' => 'Taylor']]
Validator
契約
影響の可能性: とても低い
validate
メソッドが、Illuminate\Contracts\Validation\Validator
契約に追加されました。
/**
* Run the validator's rules against its data.
*
* @return array
*/
public function validate();
このインターフェイスを実装している場合は、皆さんの実装にこのメソッドを追加してください。
テスト
影響の可能性: 中程度
Laravel5.7ではArtisanコマンドに対するテストツールが向上しました。Artisanコマンドの出力は、デフォルトでモックされるようになりました。テストの一部としてartisan
メソッドでコマンドを実行する必要がある場合は、Artisan::call
を使用するか、テストクラス中でpublic $mockConsoleOutput = false
をプロパティとして定義してください。
その他
私達はまた、laravel/laravel
GitHubリポジトリの変更を確認することを推奨しています。そうした変更の多くは必要ありませんが、皆さんのアプリケーションでは最新状態へ同期しておきたいでしょう。変更のいくつかは、このアップグレードガイドで取り扱っていますが、設定ファイルやコメントの変更のような部分は扱っていません。GitHub比較ツールで変更を確認し、皆さんにとって重要な変更を選び出すことが簡単にできます。