Laravel 5.7 アップグレードガイド

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メソッドで接続/ジョブが明確に渡されていない場合、ジョブクラスのqueueconnectionプロパティの値が利用されるようになりました。

通常、これはバグフィックスと考えられています。しかしながら、不注意によるブレイキングチェンジとしてリストアップされています。この変更により、問題に遭遇した場合は、お知らせください。

Assets

Assetディレクトリの非階層化

影響の可能性: なし

新しいLaravel5.7アプリケーションでは、スクリプトとスタイルを含んでいたassetsディレクトリは削除され、スクリプトとスタイルはresourcesディレクトリへ移動しました。これは既存のアプリケーションに影響しませんし、既存のアプリケーションを更新する必要はありません。

しかし、この変更を適用したければ、resources/assets/*下の全てのファイル/ディレクトリを一つ上の階層へ移動してください。

それから、webpack.mix.jsファイル中の、古いディレクトリの参照を更新します。

mix.js('resources/js/app.js', 'public/js')
   .sass('resources/sass/app.scss', 'public/css');

svgディレクトリの追加

影響の可能性: とても高い

publicディレクトリへ、新しくsvgディレクトリが追加されました。その中に名前が示すエラーページを表示するための、403.svg404.svg500.svg503.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インターフェイスの makeforeverメソッドの使い方が、変更されました。このインターフェイスを実装している場合は、これらのメソッドを更新してください。

データベース

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\VarDumperSymfony\Component\VarDumper\Dumper\HtmlDumperを使用する利点により、Illuminate\Support\Debug\DumperIlluminate\Support\Debug\HtmlDumperクラスは削除されました。

Eloquent

latestoldestメソッド

影響の可能性: 低い

Eloquentクエリビルダのlatestoldestメソッドは、Eloquentモデルに指定されたカスタム"created at"タイムスタンプカラムを尊重するようにアップデートされました。一般的にはこれはバグフィックスとして考えられています。しかし、不注意によるブレイキングチェンジとしてリストアップされています。

wasChangedメソッド

影響の可能性: とても低い

Eloquentモデルの変更は、updatedモデルイベントが発行される前にwasChangedメソッドが利用可能になったことです。一般的にはこれはバグフィックスとして考えられています。しかし、不注意によるブレイキングチェンジとしてリストアップされています。この変更による問題に遭遇した場合は、お知らせください

PostgreSQL特殊実数値

影響の可能性: 低い

PostgreSQLでは、実数値としてInfinity-InfinityNaNをサポートしています。Laravel5.7より前のバージョンでは、Eloquentのキャストタイプがfloatdoublerealの場合、0へキャストされていました。

Laravel5.7では、これらの値は対応するPHP定数、INF-INFNANへキャストされます。

メール確認

影響の可能性: 状況による

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契約メソッド

影響の可能性: 低い

readStreamwriteStreamメソッドが、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オプション

影響の可能性: とても低い

WorkCommandstop-when-emptyオプションが追加されました。このコマンドを拡張している場合は、クラスの$signatureプロパティへstop-when-emptyを追加する必要があります。

ルート

Route::redirectメソッド

影響の可能性: 高い

Route::redirectメソッドは、302HTTPステータスコードを返すようになりました。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比較ツールで変更を確認し、皆さんにとって重要な変更を選び出すことが簡単にできます。

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる