このリポジトリはPHP Webアプリフレームワークである、LaravelのLTSバージョンである5.5の公式英文ドキュメントを日本語へ翻訳しています。
This project is maintained by okinaka
{note} 私達は、互換性を失う可能性がある変更を全部ドキュメントにしようとしています。しかし、変更点のいくつかは、フレームワークの明確ではない部分で行われているため、一部の変更が実際にアプリケーションに影響を与えてしまう可能性があります。
Laravel5.5では、PHP7.0.0以上が必要です。
composer.jsonファイル中の、laravel/framework依存指定を5.5.*へ変更してください。さらに、phpunit/phpunitの依存指定を~6.0へ更新してください。次に、composer.jsonファイルのrequire-devセクションに、filp/whoopsパッケージのバージョン~2.0を追加します。最後に、composer.jsonファイルのscriptsセクションで、post-autoload-dumpイベントに対しpackage:discoverコマンドを追加します。
"scripts": {
...
"post-autoload-dump": [
"Illuminate\Foundation\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
],
}
もちろん、アプリケーションで使用しているサードパーティ製パッケージを調べ、Laravel5.5に適切なバージョンを使っていることも忘れず確認してください。
{tip}
laravel newを使い、Laravelインストーラによりインストールしている方は、composer global updateコマンドにより、インストーラパッケージを更新してください。
Laravel5.5とヘッドレスChromeでのテストに対し互換性のある、Laravel Dusk 2.0.0がリリースされました。
Pusherイベントブロードキャストドライバーは、Pusher SDKのバージョン~3.0が必要となりました。
Laravel5.5では、バージョン~6.0のSwift Mailerが必要です。
Laravel5.5では、カーネルへ一々登録しなくても、Artisanはコマンドを自動的に見つけ出します。この新機能を利用するには、App\Console\Kernelクラスへ以下のように、commandsメソッドを追加してください。(訳注:loadメソッドの間違い)
$this->load(__DIR__.'/Commands');
fireメソッドArtisanコマンド中のfireメソッドは、handleへリネームしてください。
optimizeコマンド最近のPHPのオペコードキャッシュの向上により、optimize Artisanコマンドは必要なくなりました。将来のリリースでLaravelから削除されるため、デプロイスクリプトからこのコマンドを外してください。
authorizeResourceコントローラメソッドauthorizeResourceメソッドへ複数の単語のモデル名を渡したとき、リソースコントローラの振る舞いと合わせるため、ルートセグメントは「スネーク」ケースになりました。
beforeポリシーメソッドポリシークラスにチェックしようとするアビリティの名前と一致する、メソッドが含まれていない場合、beforeメソッドは呼び出されなくなりました。
データベースキャッシュドライバを使用している場合、Laravel5.5へアップグレードしたアプリケーションを最初にデプロイする時に、php artisan cache:clearを実行してください。
belongsToManyメソッドEloquentモデルのbelongsToManyメソッドをオーバーライドしている場合、新しく追加された引数を反映するように、引数を更新してください。
/**
* 多対多リレーションの定義
*
* @param string $related
* @param string $table
* @param string $foreignPivotKey
* @param string $relatedPivotKey
* @param string $parentKey
* @param string $relatedKey
* @param string $relation
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function belongsToMany($related, $table = null, $foreignPivotKey = null,
$relatedPivotKey = null, $parentKey = null,
$relatedKey = null, $relation = null)
{
//
}
getQualifiedRelatedKeyNamegetQualifiedRelatedKeyNameメソッドは、getQualifiedRelatedPivotKeyNameへリネームされました。
getQualifiedForeignKeyNamegetQualifiedForeignKeyNameメソッドは、getQualifiedForeignPivotKeyNameへリネームされました。
isメソッドEloquentモデルのisメソッドをオーバーライドしている場合、メソッドからModelのタイプヒントを削除してください。これにより、isメソッドがnullを引数に取れるようになります。
/**
* 2つのモデルが同じIDで、同じテーブルに属しているか判定
*
* @param \Illuminate\Database\Eloquent\Model|null $model
* @return bool
*/
public function is($model)
{
//
}
$eventsプロパティモデルの$eventsプロパティを$dispatchesEventsへリネームしてください。多くのユーザーがeventsリレーションを定義する必要がありましたが、古いプロパティ名と競合していたため、変更されました。
$parentプロパティIlluminate\Database\Eloquent\Relations\Pivotクラスの$parent protectedプロパティを$pivotParentへ変更してください。
createメソッドBelongsToManyとHasOneOrMany、MorphOneOrManyクラスのcreateメソッドは、$attributes引数にデフォルト値を取るように変更されました。このメソッドをオーバーライドしている場合は、新しい定義に合わせて、引数を変更してください。
public function create(array $attributes = [])
{
//
}
モデルの「ソフトデリート」時に、モデルのexistsプロパティはtrueのままになりました。
withCountカラム形式エイリアス使用時、withCountメソッドは、結果のカラム名に自動的に_countを付けなくなりました。たとえば、Laravel5.4ではクエリにbar_countカラムが結果に追加されていました。
$users = User::withCount('foo as bar')->get();
しかし、Laravel5.5では、エイリアスは指定された通りに使用されます。結果のカラムに、_countを付けたい場合は、エイリアスを定義する時に、明確にサフィックスを指定します。
$users = User::withCount('foo as bar_count')->get();
配列アクセスを使う場合に、モデルのプライベートプロパティがアクセスされることを防ぐため、属性やプロパティと同じ名前のモデルメソッドを使えなくなりました。配列アクセス($user['name'])やdata_getヘルパ関数により、モデルの属性へアクセスすることで、これが起きると例外が発生します。
Laravel5.5では、バリデーション例外を含むすべての例外は、例外ハンドラによりHTTPレスポンスへ変換されています。更に、JSONバリデーションエラーのデフォルトフォーマットが変更されました。新しいフォーマットは、以下の規約にしたがっています。
{
"message": "The given data was invalid.",
"errors": {
"field-1": [
"Error 1",
"Error 2"
],
"field-2": [
"Error 1",
"Error 2"
],
}
}
Laraverl5.4のJSONエラーフォーマットをそのまま使用したい場合は、App\Exceptions\Handlerクラスへ以下のメソッドを追加してください。
use Illuminate\Validation\ValidationException;
/**
* バリデーション例外をJSONレスポンスへ変換
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Validation\ValidationException $exception
* @return \Illuminate\Http\JsonResponse
*/
protected function invalidJson($request, ValidationException $exception)
{
return response()->json($exception->errors(), $exception->status);
}
この変更は、JSONで試みる認証のバリデーションエラーフォーマットにも影響を与えます。Laravel5.5では、上記で説明した新しいフォーマット規約に従い、JSON認証に失敗したエラーメッセージも送り返されます。
個別のフォームリクエストの、レスポンスフォーマットをカスタマイズしている場合、failedValidationメソッドをオーバーライドし、カスタムレスポンスを含めたHttpResponseException例外インスタンスを投げてください。
use Illuminate\Http\Exceptions\HttpResponseException;
/**
* バリデーション試行の失敗の処理
*
* @param \Illuminate\Contracts\Validation\Validator $validator
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json(..., 422));
}
filesメソッドIlluminate\Filesystem\Filesystemクラスのfilesメソッドは、$hidden引数が追加され、allFilesメソッドのようにSplFileInfoオブジェクトの配列を返すようになりました。以前は、パス名の配列を返していました。新しい引数は以下の通りです。
public function files($directory, $hidden = false)
Illuminate\Contracts\Mail\MailQueue契約のqueueとlaterメソッドから、未使用の$dataと$callback引数が削除されました。
/**
* 送信する新しいメールメッセージをキュー
*
* @param string|array|MailableContract $view
* @param string $queue
* @return mixed
*/
public function queue($view, $queue = null);
/**
* (n)秒後に送信する新しいメールメッセージをキュー
*
* @param \DateTimeInterface|\DateInterval|int $delay
* @param string|array|MailableContract $view
* @param string $queue
* @return mixed
*/
public function later($delay, $view, $queue = null);
dispatchヘルパ即時に実行するジョブをディスパッチし、handleメソッドから値を返す場合は、ジョブのディスパッチにdispatch_nowか、Bus::dispatchNowメソッドを使用してください。
use Illuminate\Support\Facades\Bus;
$value = dispatch_now(new Job);
$value = Bus::dispatchNow(new Job);
allメソッドIlluminate\Http\Requestのallメソッドをオーバーライドしてる場合は、新しい$keys引数の使用方法を反映してください。
/**
* リクエストの入力とファイルをすべて取得
*
* @param array|mixed $keys
* @return array
*/
public function all($keys = null)
{
//
}
hasメソッド$request->hasメソッドは、入力が空文字列やnullであってもtrueを返すようになりました。以前のhasの振る舞いを提供するため、新しい$request->filledメソッドが追加されました。
intersectメソッドintersectメソッドは削除されました。この動作を模倣するため、$request->onlyの引数で、array_filterを使用してください。
return array_filter($request->only('foo'));
onlyメソッドonlyメソッドはリクエストペイロードに実際に存在する属性のみの返すようになりました。onlyメソッドの古い振る舞いを使いたい場合は、allメソッドを代わりに使用してください。
return $request->all('foo');
request()ヘルパrequestヘルパはネストしたキーを受け取らなくなりました。この振る舞いが必要であれば、リクエストのinputメソッドを使用してください。
return request()->input('filters.date');
いくつかの認証アサートは、フレームワークの他とより一貫性を持たせるため、名前を変更しました。
seeIsAuthenticatedは、assertAuthenticatedへ変更dontSeeIsAuthenticatedは、assertGuestへ変更seeIsAuthenticatedAsは、assertAuthenticatedAsへ変更seeCredentialsは、assertCredentialsへ変更dontSeeCredentialsは、assertInvalidCredentialsへ変更Mail fakeをリクエスト中にMailableがキューされたことを判定するために使用しているなら、Mail::assertSentの代わりにMail::assertQueuedを使用してください。この区別により、メールがバックグランド送信のためにキューされたが、リクエスト間では送られないことをアサートで指定できるようになりました。
Laravel Tinkerはアプリケーションクラスを参照する際の、省略した名前空間をサポートするようになりました。この機能にはComposerクラスマップの最適化が必要であるため、composer.jsonファイルのconfigセクションへ、optimize-autoloaderディレクティブを追加する必要があります。
"config": {
...
"optimize-autoloader": true
}
LoaderInterfaceIlluminate\Translation\LoaderInterfaceインターフェイスは、Illuminate\Contracts\Translation\Loaderへ変更になりました。
バリデータの全バリデーションメソッドは、protectedからpublicへ変更になりました。
ビューと変数を共有するため、動的__callメソッドが許されています。こうした変数は「キャメル」ケースとして自動的に使えるようになります。
return view('pool')->withMaximumVotes(100);
maximumVotes変数へ、テンプレートから次のようにアクセスできます。
@php Bladeディレクティブ@php Bladeディレクティブは、インラインタグを引数に取らなくなりました。代わりにディレクティブを完全に記述してください。
@php
$teamMember = true;
@endphp
私達は皆さんへ、laravel/laravel GitHubリポジトリで変更を確認することを勧めます。多くの変更は必須ではありませんが、皆さんのアプリケーションでは同期を取りたい変更もあることでしょう。そうした変更のいくつかは、このアップグレードガイドで取り扱っていますが、設定ファイルやコメントなどは載っていません。GitHub差分比較ツールで変更を簡単に確認できますので、自分にとってどの変更が重要であるかを洗い出せます。