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

重要度の高い変更

重要度が中程度の変更

7.xから8.0へのアップグレード

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

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

動作条件:PHP7.3.0

影響の可能性: 中程度

新しく必要なPHPの最低バージョンが7.3.0になりました。

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

composer.jsonファイル中に指定されている以下のパッケージ依存を更新してください。

  • guzzlehttp/guzzle^7.0.1
  • facade/ignition^2.3.6
  • laravel/framework^8.0
  • laravel/ui^3.0
  • nunomaduro/collision^5.0
  • phpunit/phpunit^9.0

以下のファーストパーティパッケージは、Laravel8をサポートするために、新しくメジャーバージョンになりました。該当するパッケージを使用している場合、アップグレードを行う前に、各アップグレードガイドを読んでください。

さらに、Laravelインストーラをcomposer create-projectとLaravel Jetstreamをサポートするためにアップデートしました。4.0より古いインストーラは2020年の10月以降動作停止します。グローバルインストーラを^4.0へすぐにアップデートしてください。

最後にアプリケーションで使用してる、その他のサードパーティパッケージを調べ、Laravel8をサポートしているバージョンを確実に使用しているかを検証してください。

コレクション

issetメソッド

影響の可能性: 低い

典型的なPHPの動作と整合性をとるため、Illuminate\Support\CollectionoffsetExistsメソッドはarray_key_existsの代わりにissetを使用するように変更しました。これにより値がnullのコレクションアイテムを扱う際の挙動に変化の生じる可能性があります。

$collection = collect([null]);

// Laravel7.x - true
isset($collection[0]);

// Laravel8.x - false
isset($collection[0]);

Database

シーダとファクトリの名前空間

影響の可能性: 高い

シーダとファクトリは名前空間になりました。これらの変更に対応するには、Database\Seeders名前空間をシードクラスに追加します。さらに、以前のdatabase/seedsディレクトリの名前をdatabase/seedersに変更する必要があります:

<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * アプリケーションのデータベースの初期値設定
     *
     * @return void
     */
    public function run()
    {
        ...
    }
}

laravel/legacy-factoriesパッケージを使用する場合は、ファクトリクラスを変更する必要はありません。ただし、ファクトリをアップグレードする場合は、それらのクラスにDatabase\Factories名前空間を追加する必要があります。

次に、composer.jsonファイルで、autoloadセクションからclassmapブロックを削除し、新しい名前空間クラス・ディレクトリマッピングを追加します。

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/"
    }
},

Eloquent

モデルファクトリ

影響の可能性: 高い

Laravelのモデルファクトリ機能は、クラスをサポートするよう完全に書き直されており、Laravel7.xスタイルのファクトリとは互換性がありません。ただし、アップグレードプロセスを簡単にするため、新しいlaravel/legacy-factoriesパッケージが作成され、Laravel 8.xで既存のファクトリを続けて使用できます。このパッケージはComposerでインストールできます。

composer require laravel/legacy-factories

Castableインターフェイス

影響の可能性: 低い

CastableインターフェイスのcastUsingメソッドは、引数の配列を引数に取るように更新されました。このインターフェイスを実装している場合は、それに応じて実装を更新する必要があります。

public static function castUsing(array $arguments);

Increment/Decrementイベント

影響の可能性: 低い

Eloquentモデルインスタンスでincrementまたはdecrementメソッドの実行時に"update"と"save"で適切な関連モデルイベントが発行されるようになりました。

イベント

EventServiceProviderクラス

影響の可能性: 低い

App\Providers\EventServiceProviderクラスにregister関数が含まれている場合は、このメソッドの先頭で確実にparent::registerを呼び出す必要があります。そうしないと、アプリケーションのイベントは登録されません。

Dispatcher契約

影響の可能性: 低い

Illuminate\Contracts\Events\Dispatcher契約のlistenメソッドを変更し、$listenerプロパティをオプションにしました。この変更は、リフレクションを介して処理されるイベントタイプの自動検出をサポートするために行いました。このインターフェイスを自分で実装している場合は、対応する実装を更新する必要があります。

public function listen($events, $listener = null);

フレームワーク

メンテナンスモードアップデート

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

Laravel8.xではメンテナンスモード機能が改善されています。メンテナンスモードテンプレートの事前レンダリングをサポートし、メンテナンスモード中にエンドユーザーがエラーに遭遇する可能性が少なくなりました。ただし、これをサポートするには、以降をpublic/index.phpファイルに追加しなくてはなりません。これらの行は既存のLARAVEL_START定数の定義直下に配置してください。

define('LARAVEL_START', microtime(true));

if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) {
    require __DIR__.'/../storage/framework/maintenance.php';
}

php artisan down --messageオプション

影響の可能性: 中程度

php artisan downコマンドの--messageオプションを削除しました。別の方法として、選択したメッセージでメンテナンスモードビューの事前レンダリングの使用を検討してください。

The php artisan serve --no-reload Option

影響の可能性: 低い

php artisan serveコマンドに--no-reloadオプションを追加しました。これにより、環境ファイルの変更が検出されたときにサーバをリロードしないように組み込みサーバに指示できます。このオプションは主にCI環境でLaravelDuskテストを実行するときに役立ちます。

$appプロパティマネージャー

影響の可能性: 低い

以前非推奨になった Illuminate\Support\Managerクラスの$appプロパティを削除しました。このプロパティに依存している場合は、代わりに$containerプロパティを使用してください。

elixirヘルパ

影響の可能性: 低い

以前、非推奨にした、elixirヘルパを削除しました。このメソッドをまだ使用しているアプリケーションは、Laravel Mixへアップグレードすることをおすすめします。

メール

sendNowメソッド

影響の可能性: 低い

以前非推奨にした、sendNowメソッドを削除しました。代わりに、sendメソッドを使用してください。

ペジネーション

ペジネーションデフォルト

影響の可能性: 高い

ペジネータは、デフォルトのスタイルにTailwind CSSフレームワークを使用するようにしました。Bootstrapを使い続けるには、以降のメソッド呼び出しをアプリケーションのAppServiceProviderbootメソッドに追加してください。

use Illuminate\Pagination\Paginator;

Paginator::useBootstrap();

キュー

retryAfterメソッド

影響の可能性: 高い

Laravelの他の機能との整合性を保つため、キュー投入したジョブ、メーラ、通知、リスナのretryAfterメソッドとretryAfterプロパティは、backoffに改名しました。アプリケーションの関連クラスで、このメソッドとプロパティの名前を変更してください。

timeoutAtプロパティ

影響の可能性: 高い

キュー投入したジョブ、通知、リスナのtimeoutAtプロパティの名前をretryUntilへ改名しました。アプリケーションの関連クラスで、このプロパティの名前を変更してください。

allOnQueue()allOnConnection()メソッド

影響の可能性: 高い

他のディスパッチメソッドとの一貫性を保つため、ジョブチェーンで使用されていたallOnQueue()メソッドとallOnConnection()メソッドを削除しました。代わりに、onQueue()メソッドとonConnection()メソッドを使用してください。これらのメソッドは、dispatchメソッドを呼び出す前に呼び出す必要があります。

ProcessPodcast::withChain([
    new OptimizePodcast,
    new ReleasePodcast
])->onConnection('redis')->onQueue('podcasts')->dispatch();

この変更は、 withChainメソッドを使用するコードにのみ影響することに注意してください。グローバルなdispatch()ヘルパを使用している場合でも、allOnQueue()allOnConnection()は引き続き使用できます。

失敗したジョブテーブルのバッチサポート

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

Laravel8.xのジョブのバッチ処理機能を使用する場合は、failed_jobsデータベーステーブルを更新する必要があります。最初に、新しいuuid列をテーブルに追加してください。

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('failed_jobs', function (Blueprint $table) {
    $table->string('uuid')->after('id')->nullable()->unique();
});

次に、queue設定ファイル内のfailed.driver設定オプションをdatabase-uuidsに更新してください。

さらに、既存の失敗したジョブに対し、UUIDを生成できます。

DB::table('failed_jobs')->whereNull('uuid')->cursor()->each(function ($job) {
    DB::table('failed_jobs')
        ->where('id', $job->id)
        ->update(['uuid' => (string) Illuminate\Support\Str::uuid()]);
});

ルーティング

コントローラ名前空間の自動プレフィクス

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

以前のLaravelリリースでは、RouteServiceProviderクラスにApp\Http\Controllersの値を持つ$namespaceプロパティが存在していました。このプロパティの値は、コントローラルート定義とコントローラルートURL生成時に、actionヘルパを呼び出す際などに自動的にプレフィックスを付けるために使われていました。

Laravel8では、このプロパティをデフォルトでnullに設定しています。これにより、コントローラのルート宣言でPHP標準callable構文を使用できるようになり、多くのIDEでコントローラクラスへのジャンプがより良くサポートされます。

use App\Http\Controllers\UserController;

// PHPのcallable記法
Route::get('/users', [UserController::class, 'index']);

// 文字列記法の使用
Route::get('/users', 'App\Http\Controllers\UserController@index');

ほとんどの場合、RouteServiceProviderには以前の値の$namespaceプロパティが含まれているため、アップグレードしているアプリケーションには影響がありません。しかし、新しいLaravelプロジェクトを作成し、アプリケーションをアップグレードした場合は、この重大な変更に遭遇するでしょう。

もとの自動プレフィクス付きコントローラルーティングを使い続けたい場合は、RouteServiceProvider内の $namespaceプロパティの値を設定し、bootメソッド内のルート登録を$namespaceプロパティを使用するように変更します。

class RouteServiceProvider extends ServiceProvider
{
    /**
     * アプリケーションの"home"ルートのパス
     *
     * ログイン後にユーザーをリダイレクトするため、Laravel認証が使用する
     *
     * @var string
     */
    public const HOME = '/home';

    /**
     * 指定されている場合、コントローラルートへ自動的に適用される名前空間
     *
     * さらに、URLジェネレータのルート名前空間としてセット
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * ルートモデル結合、パターンフィルタなどを定義
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));

            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));
        });
    }

    /**
     * アプリケーションのレート制限の設定
     *
     * @return void
     */
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
        });
    }
}

スケジュール

cron-expressionライブラリ

影響の可能性: 低い

Laravelの依存パッケージであるdragonmantank/cron-expressionが、2.xから3.xへ更新されました。これにより、cron-expressionライブラリと直接操作していない限り、アプリケーションが壊れるような変化は起こらないはずです。このライブラリを直接やりとりする場合は、変更ログを確認してください。

セッション

Session契約

影響の可能性: 低い

IlluminateContracts\Session\SessionSession 契約に新しいpullメソッドを追加しました。自分で実装している場合は、これに合わせて実装を更新してください。

/**
 * 指定キーの値を取得し、次に削除
 *
 * @param  string  $key
 * @param  mixed  $default
 * @return mixed
 */
public function pull($key, $default = null);

テスト

decodeResponseJsonメソッド

影響の可能性: 低い

Illuminate\Testing\TestResponseクラスに属するdecodeResponseJsonメソッドは、引数を取らなくなりました。代わりにjsonメソッドの使用を検討してください。

assertExactJsonメソッド

影響の可能性: 中程度

assertExactJsonメソッドは、比較する配列の数値キーが一致し、同じ順序であることを必要とするようになりました。配列の数値キーの順序を同じにすることなく、JSONを配列と比較したい場合は代わりにassertSimilarJsonメソッドが使用できます。

バリデーション

データベースルールの接続

影響の可能性: 低い

unique および exists ルールはクエリを実行する際に、Eloquentモデルで指定した(モデルのgetConnectionNameメソッドによりアクセスした)接続名を尊重するようになりました。

その他

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)へ移動

その他

?

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