ITに関するさまざまなトピックを紹介するサイトです
このコンテンツはお使いのブラウザには対応しておりません。
新しいバージョンのブラウザでアクセスしてください。

Laravelの仕様変更・互換性情報

しばらくLaravelを利用した開発プロジェクトから離れている間に、Laravelのバージョンがだいぶ上がってしまっていたので、 Laravelの復習も兼ねてバージョンアップによる変更点を調査しました。
せっかく調査したので、その内容をコンテンツにまとめてみました。
細かい変更も含めると膨大な量になってしまうので、個人の主観で主なものをピックアップしています。
対象バージョンはLaravel5.1からLaravel9.xまでです。
  このページのコンテンツを作成した当時の最新バージョンは8.xでした。
2023年2月にバージョン9.xの情報を追記しました。

稼働環境

PHP

Laravel5.3 PHP5.6.4以上
Laravel5.5 PHP7.0.0以上
Laravel5.6 PHP7.1.3以上
Laravel6 PHP7.2以上
Laravel7 PHP7.2.5以上
Laravel8 PHP7.3.0以上
Laravel9 PHP8.0.2以上

MySQL

Laravel6 MySQL5.6以上
Laravel8 MySQL5.7以上

PostgreSQL

Laravel6 PostgreSQL9.4以上
Laravel8 PostgreSQL9.6以上

ルート定義

設定ファイル

Laravel5.3から新しいトップレベルディレクトリ「routes」が導入され、 ここに「web.php」や「api.php」などの複数の設定ファイルを配置する方式に変更された。
これより前のバージョンでは「app/Http/routes.php」を設定ファイルとしていた。

コントローラ

「Route::controller」で設定する暗黙のコントローラルート定義は、Laravel5.2で非推奨となり、Laravel5.3で削除された。
Laravel8からコントローラの指定方法が変更された。
コントローラに自動的に付加されるプレフィックスがnullに変更されたため、コントローラを文字列ではなくクラスで指定するようになった。(コントローラクラスとメソッド名の文字列を配列で指定する)
Route::get('/users', [UserController::class, 'index']);
これより前のバージョンでは、コントローラ名とメソッド名を「@」記号でつないだ文字列で指定していた。
Route::get('/users', 'UserController@index');
Laravel9で、ルート定義を共通のコントローラでグループ化して定義する機能が追加された。
Route::controller(OrderController::class)->group(function () {
    Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');
});

モデル

ディレクトリ

Laravel8からモデルクラスのデフォルトの配置ディレクトリが「app/Models」に変更された。
namespaceは「App\Models」となる。
これより前のバージョンでは、「app」ディレクトリをデフォルトの配置先としていた。

クエリビルダ

単一のカラムの値を取得するメソッドに関して、Laravel5.2でlists()メソッドが非推奨となり、新たにpluck()メソッドが追加された。
lists()メソッドはLaravel5.3で削除された。

データ型

日付として扱うカラムを指定する$datesプロパティはLaravel8で非推奨となった。
代わりに日付に限らず型変換全般を指定する$castsプロパティを使用する。($castsプロパティは以前のバージョンから存在している)

リレーション

Laravel5.2.32で関連モデルの件数を合わせて取得するwithCount()メソッドが追加された。
件数はリレーション定義元モデルから「{リレーション名}_count」プロパティで取得できる。
$posts = Post::withCount('comments')->get();
foreach($posts as $post) {
    echo $post->comments_count;
}
Laravel5.2.39で、デフォルト指定した「Eager Loading」対象リレーションの中からそのクエリにおいて対象外とするリレーションを指定するwithout()メソッドが追加された。
デフォルトの「Eager Loading」対象のリレーションは$withプロパティに指定する。($withプロパティは以前のバージョンから存在している)
$books = Book::without('author')->get();
Laravel5.3.23で、「Eager Loading」を指定するwith()メソッドに取得対象カラムを限定する機能が追加された。
リレーション名の後ろに「:(コロン)」記号で取得対象カラムをつなげて列挙する。
$books = Book::with('author:id,name,book_id')->get();
取得対象カラムには主キーと該当リレーションの外部キーを含める必要がある。
Laravel5.8で「Has One Through」のリレーションタイプが追加された。
他のモデルを経由して1対1となる関係を表すもので、hasOneThrough()メソッドで定義する。
1対1の関係となるモデル、中間のモデルの順で引数を指定する。
Laravel8.12.0で関連モデルの各種集計値を合わせて取得するメソッドが追加された。
集計値はリレーション定義元モデルから「{リレーション名}_{集計機能名}_{カラム名}」プロパティで取得できる。
withMin() 関連モデルの指定カラムの最小値を取得する。
withMax() 関連モデルの指定カラムの最大値を取得する。
withAvg() 関連モデルの指定カラムの平均値を取得する。
withSum() 関連モデルの指定カラムの合計値を取得する。
以下は、withSum()メソッドの使用例。
$posts = Post::withSum('comments', 'votes')->get();
foreach($posts as $post) {
    echo $post->comments_sum_votes;
}
Laravel8.40.0で、デフォルト指定した「Eager Loading」対象リレーションをそのクエリにおいて変更(全体入替)するwithOnly()メソッドが追加された。
デフォルトの「Eager Loading」対象のリレーションは$withプロパティに指定する。($withプロパティは以前のバージョンから存在している)
$books = Book::withOnly('genre')->get();
Laravel8.42.0で「Has One Of Many」のリレーションタイプが追加された。
1対多の中の1つの関係を表すもので、hasOne()メソッドとofMany()メソッドを組み合わせて定義する。
latestOfMany() ソート可能なモデルの主キーの最新の関連モデルを取得する。
例)$this->hasOne(Order::class)->latestOfMany();
oldestOfMany() ソート可能なモデルの主キーの最古の関連モデルを取得する。
例)$this->hasOne(Order::class)->oldestOfMany();
ofMany() 任意のカラムの最大または最小の関連モデルを取得する。
例)$this->hasOne(Order::class)->ofMany('price', 'max');

データベース

PDO

Laravel5.4からPDOのフェッチモードがデフォルトで「PDO::FETCH_CLASS(クラスオブジェクト)」となり、「config/database.php」ファイルで設定することができなくなった。
変更したい場合は、イベントリスナーを設定するなどの対応が必要となる。
これより前のバージョンでは、「config/database.php」ファイル内で「fetch」キーで指定することが可能だった。

PostgreSQL

Laravel9から、「config/database.php」ファイル内のPostgreSQLの接続設定の「schema」キーの名称が「search_path」に変更された。

マイグレーション

外部キー指定

Laravel7.0.0でIlluminate\Database\Schema\Blueprintクラスに「UNSIGNED BIGINTカラム」を作成するforeignId()メソッドが追加され、 さらにLaravel7.1.0でIlluminate\Database\Schema\ForeignIdColumnDefinitionクラスにconstrained()メソッドが追加され、外部キーの指定が簡単になった。
テーブル定義を指定するSchemaビルダのクロージャの中で、以下の2通りの記述は同じ内容となる。
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
$table->foreignId('user_id')->constrained();

認証

ユーザ登録

Laravel5.7でユーザ登録時にメール確認する機能が追加された。
この機能を有効にするためには、UserモデルにIlluminate\Contracts\Auth\MustVerifyEmailインターフェースを実装する。

パッケージ構成

Laravel6からフロントエンドのコンポーネント類が本体から分離され、これに伴いユーザ登録時の認証処理もデフォルトでは含まれなくなった。
フロントエンドのコンポーネント類を追加するためには、「laravel/ui」パッケージをインストールする。
$composer require laravel/ui
ビューのスカフォールド作成時に「--auth」オプションを付けると、ユーザ登録時の認証処理も追加される。
$php artisan ui {ビュータイプ} --auth
ビュータイプには、「bootstrap」「vue」「react」を指定できる。
Laravel8からはさらに新しいパッケージが導入され、複数のスターターキットが用意されている。
Laravel Breezeシンプル、最小限(Jetstreamの簡易版)
Laravel Fortifyバックエンドのみ
Laravel Breeze高機能
Breezeをインストールして利用する場合の一連の作業は以下のようになる。
$composer require laravel/breeze --dev
$php artisan breeze:install
$npm install
$npm run dev

バリデーション

メールアドレス

Laravel5.8から新しいメールアドレスバリデーションパッケージが追加され、デフォルト設定が変更された。
メールアドレスのバリデーション設定のデフォルトが「rfc」となり、これはRFC6530に準拠しているかをチェックする。
これより前のバージョンでは、メールアドレスのバリデーション設定のデフォルトは「filter」で、これはRFC822に準拠しているかをチェックする。

配列

Laravel9で、ネストした配列データのバリデーションルールの記述を簡素化するRule::forEach()メソッドが追加された。

パスワード

Laravel9から、認証済みユーザの現在のパスワードと一致するかをチェックする「password」ルールの名前が「current_password」へ変更された。

文字列

Laravel9.40.0で、入力を小文字に制限する「lowercase」ルールと入力を大文字に制限する「uppercase」ルールが追加された。

メール送信

設定ファイル

Laravel5.3で「pretend」キーが削除された。
代わりにlogドライバを使用する。
Laravel5.4からマークダウン形式のメール送信が可能になり、それに伴う設定項目として「markdown」キーが追加された。
Laravel7でメール送信の仕様が変更され、複数のドライバに対応できるようになり、設定ファイルの構成も変更された。
「driver」キーは「default」キーに変更された。
「mailers」キーが追加され、この配列に複数のドライバを登録することができるようになった。
後方互換性のためにLaravel6までの形式もサポートされている。

メールドライバ

「sparkpost」はLaravel5.2で追加されたが、Laravel6で削除された。
「array」はLaravel5.3.29で追加された。
メモリに記録する。(テスト時の利用を想定)
「postmark」はLaravel5.8で追加された。
「mandrill」はLaravel6で削除された。
「failover」はLaravel8で追加された。
メール送信サービスの停止に備えて、バックアップ用のドライバを登録しておくことができる。
Laravel9で、メール送信に使用するライブラリがSwift Mailerから後継のSymfony Mailerに変更された。

メール送信方法

Laravel5.3で新しく導入されたIlluminate\Mail\Mailableクラスを作成する方式が利用できるようになった。
Laravel5.3.7から、Illuminate\Mail\Mailableクラスを作成してメール送信する方式において、宛先指定のto()メソッドなどをチェーンで繋げるようになった。
send()メソッドの引数にMailableクラスのインスタンスを渡す。
Mail::to($user)->send(new OrderShipped($order));

ページネーション

出力方法

Laravel5.2でlinks()メソッドが追加された。
links()メソッドは、以前のバージョンから存在しているrender()メソッドへ処理を委譲しているだけだが、render()メソッドの実装内容も変更されている。
これより前のバージョンでは、render()メソッドは文字列を生成して返す処理だったが、Illuminate\Support\HtmlStringクラスのインスタンスを生成して返す処理に変更された。
Illuminate\Support\HtmlStringクラスはIlluminate\Contracts\Support\Htmlableインターフェースを実装しているため、出力の際にe()ヘルパー関数や「{{ }}」記号による出力が可能になった。
Laravel5.1までは、以下のように記述していた。
{!! $users->render() !!}
Laravel5.2以降は、以下のように記述できる。
{{ $users->links() }}
Laravel5.2以降で「{!! !!}」記号を使っても同じ結果となるが、Laravel5.1でrender()メソッドの出力結果を「{{ }}」記号で出力するのはNGとなる。
「{{ }}」記号による出力ではXSS攻撃を防ぐためにエスケープ処理を実行するが、Illuminate\Contracts\Support\Htmlableインターフェースを実装したオブジェクトが渡された場合は、エスケープ処理せずにそのまま出力する。
(Laravel5.1から)

CSS

Laravel9で、Bootstrap5を使用したページネーションビューが追加された。
App\Providers\AppServiceProviderクラスのboot()メソッドで設定する。
Paginator::useBootstrapFive();

セッション

設定ファイル

Laravel5.2.36で「http_only」キーが追加された。
JavaScriptからセッションCookieにアクセスさせないかどうかを指定する。(デフォルト:不可)
JavaScriptからアクセス不可とすることにより、XSS攻撃を防ぐのに役立つ。
Laravel5.3で「store」キーが追加された。
セッションドライバにキャッシュ方式のものを使用する場合、「config/cache.php」設定ファイルの「stores」キーに設定した保存先を指定する。
Laravel5.5.15で「same_site」キーが追加された。
クロスサイトリクエストが発生した時のCookieの動作を設定する。
「strict」「lax」「none」「null」のいずれかを設定する。
デフォルトは「lax」で、一番厳しい設定の「strict」と従来と同じ動作となる「none」の中間レベルの設定となる。
設定によりCSRF攻撃を軽減する効果が期待できる。

セッションドライバ

Laravel5.8で「dynamodb」が追加された。

セッションの操作

Laravel5.3で、キーの存在を確認するexists()メソッドが追加された。
以前のバージョンから存在しているhas()メソッドは、キーが存在していても値がnullの場合はfalseを返すが、 exists()メソッドは値がnullでもキーが存在していればtrueを返す。
Laravel8.37.0で、キーが存在しないことを確認するmissing()メソッドが追加された。
キーが存在しないか値がnullの場合にtrueを返す。

キャッシュ

キャッシュストア

Laravel5.2で、Windowsで動作するPHPアクセラレータの「Windows Cache Extension for PHP」を利用するWincacheのドライバーが削除され、 代わりにwmather/wincacheパッケージをインストールして利用する形式に変わった。
Laravel5.2で、PHPアクセラレータのXCacheを利用するXCacheのドライバーが削除された。
Laravel5.8で、AWSのキー/バリュー型のデータストアのDynamoDBを利用する「dynamodb」が追加された。

キャッシュ時間

Laravel5.8から、各メソッドで指定するキャッシュ時間の単位が「秒」単位になった。
これより前のバージョンでは「分」単位だった。

エラー処理

カスタマイズ

Laravel5.5から、カスタム例外クラスを作成する場合、そのクラスにreport()メソッドとrender()メソッドを定義して、例外記録とレスポンス生成処理を実装することができるようになった。
これらのメソッドはフレームワークから自動的に呼び出される。
Laravel8.33.0から、エラー処理をカスタマイズする場合、App\Exceptions\Handlerクラスのregister()メソッドをオーバーライドし、 例外記録とレスポンス生成の両方の処理をこのメソッド内にまとめて実装することができるようになった。
例外記録処理はreportable()メソッドを使用して定義する。
レスポンス生成処理はrenderable()メソッドを使用して定義する。
これより前のバージョンでは、それぞれApp\Exceptions\Handlerクラスのreport()メソッドとrender()メソッドをオーバーライドする方式だった。

例外コンテキスト

デフォルトでは、(取得可能であれば)現在のユーザID情報が例外のコンテキストデータとして追加される。
Laravel5.5で、App\Exceptions\Handlerクラスにcontext()メソッドが追加され、例外のコンテキストデータに任意のデータを追加することができるようになった。
Laravel6.7.0からは、個別の例外クラスにcontext()メソッドを定義することも可能になった。

ログ

設定ファイル

Laravel5.6から新しい設定ファイル「config/logging.php」が導入された。
これより前のバージョンでは「config/app.php」設定ファイル内の「log」キーで指定していた。

出力方式

Laravel5.6でログ出力の仕様が大きく変更され、ログ出力方式を表すチャンネルという概念が導入された。
チャンネルとして複数のログ出力方式を定義することができ、適宜チャンネルを切り替えてログ出力することができる。
複数のチャンネルを単一のチャンネルとして扱う「stack」というチャンネルを利用することもできる。(デフォルトチャンネルとして「stack」が設定されている)

ファサード

Laravel5.6での仕様変更に伴い、Logファサードの実体クラスがIlluminate\Log\WriterクラスからIlluminate\Log\LogManagerクラスに変更された。

イベント

イベント操作

イベントを発行するIlluminate\Events\Dispatcherクラス(Eventファサードの実体)のfire()メソッドは、Laravel5.4で非推奨となり、Laravel5.8で削除された。
代わりにdispatch()メソッドを使用する。

コアイベント

Laravelが発行するいくつかのコアイベントが、Laravel5.2からLaravel5.4へかけて、文字列からイベントオブジェクトへ変更された。
以下の一覧表は変更されたコアイベントの一部を示したもの。
イベント発行タイミング 変更前イベント名 変更後クラス
ログイン成功時 auth.login Illuminate\Auth\Events\Login
データベースへのクエリ発行後 illuminate.query Illuminate\Database\Events\QueryExecuted
ログ出力 illuminate.log Illuminate\Log\Events\MessageLogged
なお、ログ出力イベントはログ出力前に発行されていたが、Laravel7.1.0からはログ出力後にイベント発行するように変更された。

多言語化

言語ファイル

Laravel5.4からJSON形式の言語ファイルも利用できるようになった。
ファイルは言語ごとのディレクトリ配下に作成するのではなく、「resources/lang」ディレクトリ直下に配置する。
ファイル名は、「{言語省略名}.json」となる。

ディレクトリ

Laravel9で、言語ファイルの配置ディレクトリが「resources/lang」から「lang」に変更された。

サービスプロバイダ

サービスプロバイダの実装

Laravel5.6で$bindingsプロパティと$singletonsプロパティが追加された。
単純なバインド処理の定義をこれらのプロパティに配列で定義することができるようになった。
Laravel5.8で遅延ロードを設定する$deferプロパティが非推奨になった。
代わりにIlluminate\Contracts\Support\DeferrableProviderインターフェイスを実装する。
このインターフェースにはprovides()メソッドのみが定義されているが、provides()メソッドの定義自体はこれより前のバージョンと同様に実装する。

ヘルパー関数

Laravel5.3でcache()ヘルパー関数が追加された。
Laravel5.4で__()ヘルパー関数が追加された。(アンダースコア記号連続2個)
追加された当初はJSON形式の言語ファイルを対象として翻訳処理を実行する関数だったが、Laravel6で翻訳機能の仕様が変更され、trans()ヘルパー関数と同じ処理を実行するようになった。
Laravel5.5でreport()ヘルパー関数が追加された。
Laravel9でstr()ヘルパー関数が追加された。
引数に文字列を渡すと、Illuminate\Support\Stringableインスタンスを返す。(Str::of()メソッドと等価)
引数なしの場合、Illuminate\Support\Strインスタンスを返す。
Laravel9でto_route()ヘルパー関数が追加された。
指定した名前付きルートへのリダイレクトHTTPレスポンスを生成する。
Laravel9.42.0で、条件付きで例外をスローするreport_if()ヘルパー関数とreport_unless()ヘルパー関数が追加された。

ファイル操作

パッケージ

Laravel9で、Storageファサードの機能を担うFlysystemのバージョンが1.xから3.xへ移行された。
S3、FTP、SFTPドライバを使用する前に、Composerで適切なパッケージをインストールする必要がある。

Bladeテンプレート

ディレクティブ

Laravel9で、新たなディレクティブが追加された。
@checkedチェックボックスがcheckedであることを表す。
@selectedselectのoptionがselectedであることを表す。
@disabled要素がdisabledであることを表す。
Laravel9.0.2で追加
これらは同名のVueイベント(v-on)の省略記法と競合する可能性があるが、@@でディレクティブをエスケープすることで衝突を回避することができる。

コレクション

Laravel9で、reduceWithKeys()メソッドが削除された。
同じ機能が提供されているreduce()メソッドを使う。
Laravel9から、reduceMany()メソッドの名称がreduceSpread()へ変更された。(他のメソッドと名前の一貫性を保つため)

当サイトでは、第三者配信による広告サービスを利用しています。 このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報(氏名、住所、メール アドレス、電話番号は含まれません)を使用することがあります。 このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、こちらをクリックしてください。