Laravel 6.x アップグレードガイド

重要度の高い変更

重要度が中程度の変更

5.8から6.0へのアップグレード

アップグレード見積もり時間:1時間

Note: 私達は、互換性を失う可能性がある変更を全部ドキュメントにしようとしています。しかし、変更点のいくつかは、フレームワークの明確ではない部分で行われているため、一部の変更が実際にアプリケーションに影響を与えてしまう可能性があります。

動作要件:PHP7.2

影響の可能性: 中程度

PHP7.1は2019年12月に積極的にメンテナンスされなくなっています。そのため、Laravel6.0はPHP7.2以上を動作要件とします。

依存パッケージのアップデート

composer.jsonファイル中のlaravel/framework指定を^6.0に更新してください。

次に、アプリケーションで使用しているサードパーティパッケージを調べ、Laravel6をサポートする適切なバージョンを使用しているか確認してください。

認可

認可リソースとviewAny

影響の可能性: 高い

authorizeResourceメソッドを用いてコントラーへ付加している認可ポリシーは、viewAnyメソッドを定義する必要があります。コントローラのindexメソッドへユーザーがアクセスする時に呼び出されます。定義しない場合は非認可扱いとなり、コントローラのindexメソッドへの呼び出しは拒否されます。

認可レスポンス

影響の可能性: 低い

Illuminate\Auth\Access\Responseクラスのコンストラクタの使用法を変更しました。適宜更新してください。認可レスポンスを自力で構築しておらず、ポリシーのallowdenyインスタンスメソッドだけを使用しているなら、変更の必要はありません。

/**
 * 新しいレスポンスの生成
 *
 * @param  bool  $allowed
 * @param  string  $message
 * @param  mixed  $code
 * @return void
 */
public function __construct($allowed, $message = '', $code = null)

「Deny」レスポンスを返す

影響の可能性: 低い

以前のリリースのLaravelでは即時に例外が投げられるため、ポリシーメソッドからdenyメソッドの値を返す必要はありませんでした。しかしながら現在はLaravelのドキュメント通りに、ポリシーからdenyメソッドの値を返す必要があります。

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契約

影響の可能性: 低い

Illuminate\Contracts\Auth\Access\Gate契約は、新しくinspectメソッドを追加しました。自力でこのインターフェイスを実装している場合は、このメソッドを実装へ加えてください。

Carbon

Carbon 1.xのサポート停止

影響の可能性: 中程度

Carbon 1.xのメンテナンス切れが近づいて来たため、サポートを停止しました。Carbon2.0を使用するようにアプリケーションをアップグレードしてください。

設定

AWS_REGION環境変数

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

Laravel Vaporを利用する計画がある場合は、configディレクトリ中のファイルのすべてのAWS_REGION出現箇所をAWS_DEFAULT_REGIONへ更新してください。さらに、この環境変数の名前を.envファイルに含めてください。

Redisデフォルトクライアント

影響の可能性: 中程度

デフォルトのRedisクライアントをpredisからphpredisへ変更しました。predisを使い続けるには、config/database.php設定ファイルのredis.client設定オプションをpredisに指定してください。

DynamoDBキャッシュ保存

影響の可能性: 条件による

Laravel Vaporの使用を計画している場合は、config/cache.phpファイルにdynamodb保存のオプションを含むように変更してください。

<?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環境変数

影響の可能性: 条件による

Laravel Vaporの使用を計画している場合は、config/queue.phpファイルにsqs接続の環境変数オプションを含むように変更してください。

<?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'),
        ],
    ],
    ...
];

データベース

Capsule::tableメソッド

影響の可能性: 中程度

Note: この変更はilluminate/databaseを依存パッケージとして使用している、Laravel以外のアプリケーションに適用されます。

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

影響の可能性: 低い

cursorメソッドがGeneratorインスタンスの代わりに、Illuminate\Support\LazyCollectionインスタンスを返すようにしました。LazyCollectionもジェネレータ同様に繰り返し処理できます。

$users = App\User::cursor();

foreach ($users as $user) {
    //
}

Eloquent

BelongsTo::updateメソッド

影響の可能性: 中程度

一貫性を取るため、BelongsToリレーションのupdateメソッドは、アドホックな更新クエリとして機能するようにしました。つまり、複数代入の保護やEloquentイベントの発行を行わなくなりました。これにより、他のタイプのリレーションのupdateメソッドと一貫性が取れました。

BelongsToリレーションを通じて所属しているモデルを更新し、複数代入更新の保護とイベントを受け取りたい場合は、モデル自身のupdateメソッドを呼び出してください。

// アドホッククエリ、複数代入保護やイベントはない
$post->user()->update(['foo' => 'bar']);

// モデルの更新、複数代入保護とイベントは提供される
$post->user->update(['foo' => 'bar']);

ArrayableとtoArray

影響の可能性: 中程度

EloquentモデルのtoArrayメソッドは、Illuminate\Contracts\Support\Arrayableを実装している属性を全部配列へキャストするようにしました。

主キータイプの宣言

影響の可能性: 中程度

Laravel6.0では、整数キータイプに対するパフォーマンスの最適化を行いました。モデルの主キーに文字列を使用してる場合は、モデル上の$keyTypeプロパティを使い、キータイプを宣言する必要があります。

/**
 * 主キーの「タイプ」
 *
 * @var string
 */
protected $keyType = 'string';

メール確認

再送信確認ルートのHTTPメソッド

影響の可能性: 中程度

CSRF攻撃の可能性を防ぐため、Laravelの組み込みメール確認を利用する場合に、ルータに登録されるemail/resendルートは、GETからPOSTへメソッドを変更しました。そのため、このルートに対して正しいリクエストタイプを送るように、フロントエンドを更新する必要があります。たとえば、組み込みのメール確認テンプレートのスカフォールドを使用している場合は、次のようになります。

{{ __('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契約

影響の可能性: 低い

Illuminate\Contracts\Auth\MustVerifyEmail契約へ新たに、getEmailForVerificationメソッドを追加しました。この契約を自分で実装している場合は、このメソッドを実装してください。このメソッドはオブジェクトに関連したメールアドレスを返します。App\UserモデルでIlluminate\Auth\MustVerifyEmailトレイトを使用している場合は、このトレイトの実装でメソッドを実装しているため、必要な変更はありません。

メール確認ルートの変更

影響の可能性: 中程度

メール確認ルートは/email/verify/{id}から/email/verify/{id}/{hash}へ変更しました。Laravel6.xへアップグレードする前のバージョンから送信されたメール確認メールは無効になり、404ページが表示されます。望むのであれば、古い認証のURLパスに合うルートを定義し、ユーザーへメールアドレスを再ベリファイするように情報メッセージを表示しましょう。

ヘルパ

文字列と配列のヘルパパッケージ

影響の可能性: 高い

すべてのstr_array_ヘルパは新しいlaravel/helpers Composerパッケージに移され、フレームワークから削除しました。望みであればこれらのヘルパの呼び出しすべてで、Illuminate\Support\StrIlluminate\Support\Arrクラスを使ってください。もしくは、アプリケーションへ新たにlaravel/helpersパッケージを追加すれば、こうしたヘルパを今までどおり利用できます。

composer require laravel/helpers

多言語化

Lang::transLang::transChoiceメソッド

影響の可能性: 中程度

トランスレータのLang::transLang::transChoiceメソッドは、Lang::getLang::choiceへリネームしました。

さらに、Illuminate\Contracts\Translation\Translator契約を自分で実装している場合は、その実装のtranstransChoicegetchoiceへ更新してください。

Lang::getFromJsonメソッド

影響の可能性: 中程度

Lang::getLang::getFromJsonメソッドはまとめました。Lang::getFromJsonメソッドの呼び出しは、Lang::getを呼び出すように更新してください。

Note: Lang::transChoiceLang::transLang::getFromJsonの削除に関連するBladeエラーを防ぐために、php artisan view:clear Artisanコマンドを実行すべきでしょう。

メール

MandrillとSparkPostドライバの削除

影響の可能性: 低い

mandrillsparkpostメールドライバは削除しました。続けてどちらかのドライバを使用したい場合は、そうしたドライバを提供するコミュニティによりメンテナンスされているパッケージを選び、採用することを推奨します。

通知

Nexmoルーティングの削除

影響の可能性: 低い

しばらく残していましたが、フレームワークのコアからNexmo通知チャンネルを削除しました。Nexmo通知を利用していた方は、ドキュメントで説明している通りに、Notifiableエンティティに自分で実装してください。

パスワードリセット

パスワードの検証

影響の可能性: 低い

PasswordBrokerはパスワードの制限やバリデーションを行わなくしました。パスワードのバリデーションはすでにResetPasswordControllerクラスで行っており、ブローカのバリデーションは冗長でカスタマイズ不可能でした。PasswordBroker(もしくはPasswordファサード)を組み込まれているResetPasswordController以外で使用している場合は、ブローカへ渡す前にすべてのパスワードをバリデートする必要があります。

キュー

キュー試行回数制限

影響の可能性: 中程度

以前のリリースのLaravelは、php artisan queue:workコマンドは無制限にジョブを再試行していました。Laravel6.0からこのコマンドは、デフォルトで1回試行します。強制的に無制限回試行したい場合は、--triesオプションに0を指定してください。

php artisan queue:work --tries=0

さらに付け加え、アプリケーションのデータベースへ確実にfailed_jobsテーブルを持たせてください。このテーブルのマイグレーションは、queue:failed-table Artisanコマンドで生成できます。

php artisan queue:failed-table

リクエスト

Inputファサード

影響の可能性: 中程度

Inputファサードは基本的にRequestファサードの重複でしたが、削除しました。Input::getメソッドを使用していた場合、Request::inputメソッドを使ってください。他のInputファサードの呼び出しも、シンプルにRequestファサードの使用へ更新できます。

スケジュール

betweenメソッド

影響の可能性: 低い

以前のリリースのLaravelでは、スケジューラのbetweenメソッドは日付の境界に関して混乱をもたらす動作をしていました。例をご覧ください。

$schedule->command('list')->between('23:00', '4:00');

ほとんどのユーザーは、このメソッドは23:00から4:00までの間の毎分、listコマンドを実行すると期待するでしょう。しかしながら、以前のLaravelのリリースでは、スケジューラは時間を入れ替えて、4:00から23:00までの毎分listコマンドを実行していました。Laravel6.0では期待通りに動作します。

ストレージ

Rackspaceストレージドライバの削除

影響の可能性: 低い

rackspaceストレージドライバを削除しました。Rackspaceをストレージプロバイダとして使い続けたい場合は、このドライバを提供するコミュニティがメンテナンスしているパッケージを採用することを推奨します。

URL生成

ルートURLジェネレータと追加のパラメータ

以前のリリースのLaravelでは、routeヘルパやURL::routeメソッドへ連想配列のパラメータを渡した場合、パラメータの値にルートパスと一致するキーがない場合であってもルートへのURLを生成する場合、まれにパラメータをURI値として使用していました。Laravel6.0からは、こうした値は代わりにクエリ文字列として付け加えます。例として、以下のルートを考えてください。

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メソッドもこの変更の影響を受けます。

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]);

バリデーション

FormRequestのvalidationDataメソッド

影響の可能性: 低い

リクエストのvalidationDataメソッドをprotectedからpublicへ変更しました。皆さんの実装でこのメソッドをオーバーライドしている場合は、publicの可視性へ変更してください。

その他

laravel/laravelGitHubリポジトリで、変更を確認することを推奨します。これらの変更は必須でありませんが、皆さんのアプリケーションではファイルの同期を保つほうが良いでしょう。変更のいくつかは、このアップグレードガイドで取り扱っていますが、設定ファイルやコメントなどの変更は取り扱っていません。変更は簡単に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)へ移動

その他

?

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