Laravel 9.x リリースノート

バージョニング規約

Laravelとファーストパーティパッケージは、セマンティックバージョニングにしたがっています。メジャーなフレームのリリースは、毎年2月にリリースします。マイナーとパッチリリースはより細かく毎週リリースします。マイナーとパッチリリースは、決してブレーキングチェンジを含みません

あなたのアプリケーションやパッケージから、Laravelフレームワーク、もしくはコンポーネントを参照する場合は、Laravelのメジャーリリースには重大な変更が含まれているため、常に^ 9.0などのようにバージョンを指定する必要があります。ただし、私たちは1日中以内に新しいメジャーリリースへ更新できるように、常に努力しています。

名前付き引数

名前付き引数は、Laravelの下位互換性ガイドラインの対象外です。Laravelコードベースを改善するために、必要に応じて関数の引数の名前を変更することもできます。したがって、Laravelメソッドを呼び出すときに名前付き引数を使用する場合は、パラメーター名が将来変更される可能性があることを理解した上で、慎重に行う必要があります。

サポートポリシー

Laravelのすべてのリリースは、バグフィックスは18ヶ月、セキュリティフィックスは2年です。Lumenのようなその他の追加ライブラリでは、最新のメジャーリリースのみでバグフィックスを受け付けています。また、Laravelがサポートするデータベースのサポートについても確認してください。

バージョン PHP (*) リリース バグフィックス期日 セキュリティ修正期日
6 (LTS) 7.2 - 8.0 2019年9月3日 2022年1月25日 2022年9月6日
7 7.2 - 8.0 2020年3月3日 2020年10月6日 2021年3月3日
8 7.3 - 8.1 2020年9月8日 2022年7月26日 2023年1月24日
9 8.0 - 8.1 2022年2月8日 2023年8月8日 2024年2月8日
10 8.1 2023年2月7日 2024年8月7日 2025年2月7日
End of life
Security fixes only

(*) 対応PHPバージョン

Laravel9

ご存知かもしれませんが、Laravel8のリリース時から、Laravelは年次リリースに移行しました。以前は、メジャーバージョンを6か月ごとにリリースしていました。この変更はコミュニティのメンテナンスの負担を軽減することと、開発チームが互換性を失う変更を加えることなく、驚くべき強力な新機能を出荷する試みができることを目的としています。そのため、下位互換性を損なうことなく、さまざまな堅牢な機能をLaravel8へ取り入れました。並列テストのサポート、Breezeスターターキットの改善、HTTPクライアントの改善、さらに"has one of many"を含む、新しいEloquentリレーションシップタイプなどです。

したがって、現在のリリースへ優れた新機能を導入するこの取り組みにより、将来の「メジャー」リリースが主にアップストリームの依存関係のアップグレードなど、「メンテナンス」タスクに使用されるようになります。これは、これらのリリースノートに記載されています。

Laravel9、Symfony6.0コンポーネントの動作には、PHP8.0以上が必要です。Flysystem3.0のサポート、改良したroute:list表示、Laravel Scoutデータベースドライバ、新しいEloquentアクセサ/ミューテタ構文、Enumによる暗黙のルート結合、その他様々なバグ修正とユーザービリティ向上によりLaravel8.xで改善されたことを継続しています。

PHP8.0

Laravel9.xの動作には、PHP8.0以上が必要です。

Symfony Mailer

Symfony Mailerのサポートは、Dries VintsJames BrooksJulius Kiekbuschが貢献しました。

以前のLaravelリリースは、送信メールの送信にSwift Mailerライブラリが利用していました。しかし、このライブラリはすでにメンテナンスされておらず、Symfony Mailerに継承されています。

皆さんのアプリケーションとSymfony Mailerとの互換性の詳細を確認するには、アップグレードガイドを参照してください。

Flysystem3.x

Flysystem3.xのサポートは、Dries Vintsが貢献しました。

Laravel9.xは、上流のFlysystem依存パッケージをFlysystem3.xへアップグレードしています。Flysystemは、Storageファサードが提供するファイルシステム操作のすべてを提供しています。

皆さんのアプリケーションが、Flysystem3.xと互換性を持つための詳細は、アップグレードガイドを参照してください。

Eloquentアクセサ/ミューテタの向上

Eloquentアクセサ/ミューテタの改良は、Taylor Otwellが貢献しました。

Laravel9.xは、Eloquentのアクセサとミューテタを定義する新しい方法を提供しました。以前のLaravelのリリースでは、アクセサやミューテタを定義する方法は、以下のようにモデルにプレフィックス付きのメソッドを定義することのみでした。

public function getNameAttribute($value)
{
    return strtoupper($value);
}

public function setNameAttribute($value)
{
    $this->attributes['name'] = $value;
}

しかし、Laravel9.xでは、Illuminate\Database\Eloquent\Casts\Attributeタイプの戻り値をタイプヒントすることで、プレフィックスを使わない単独のメソッドを使用して、アクセサとミューテタを定義することができます。

use Illuminate\Database\Eloquent\Casts\Attribute;

public function name(): Attribute
{
    return new Attribute(
        get: fn ($value) => strtoupper($value),
        set: fn ($value) => $value,
    );
}

さらに、アクセサを定義するこの新しいアプローチにより、カスタムキャストクラスのように、属性が返したオブジェクト値をキャッシュするようになります。

use App\Support\Address;
use Illuminate\Database\Eloquent\Casts\Attribute;

public function address(): Attribute
{
    return new Attribute(
        get: fn ($value, $attributes) => new Address(
            $attributes['address_line_one'],
            $attributes['address_line_two'],
        ),
        set: fn (Address $value) => [
            'address_line_one' => $value->lineOne,
            'address_line_two' => $value->lineTwo,
        ],
    );
}

Enum Eloquent属性キャスト

Warning!! EnumキャストはPHP8.1以上で利用できます。

Enumキャストは、Mohamed Saidが貢献しました。

Eloquentは、属性値をPHPの「値に依存した(backed)」 Enumsへキャストできるようになりました。これを使用するには、モデルの$castsプロパティ配列で、キャストしたい属性と列挙型を指定します。

use App\Enums\ServerStatus;

/**
 * キャストする属性
 *
 * @var array
 */
protected $casts = [
    'status' => ServerStatus::class,
];

一度、モデルでキャストを定義したら、属性を操作するとき、指定した属性は自動的にenumへキャストされたり、enumからキャストされたりします。

if ($server->status == ServerStatus::provisioned) {
    $server->status = ServerStatus::ready;

    $server->save();
}

Enumによる暗黙のルート結合

Enumによる暗黙のルート結合は、Nuno Maduroが貢献しました。

PHP 8.1では、Enumsがサポートされました。Laravel9.xでは、ルート定義にEnumをタイプヒントする機能が導入され、LaravelはそのルートセグメントがURIの有効なEnum値である場合にのみルートを呼び出します。そうでない場合は、HTTP 404レスポンスを自動的に返します。例えば、次のようなEnumがあるとします。

enum Category: string
{
    case Fruits = 'fruits';
    case People = 'people';
}

{category}ルートセグメントが、fruitsまたはpeopleである場合にのみ呼び出されるルートを定義しています。そうでない場合は、HTTP 404レスポンスを返します。

Route::get('/categories/{category}', function (Category $category) {
    return $category->value;
});

ルート結合における制限の強制

制限の強制付き結合は、Claudio Dekkerが貢献しました。

以前のLaravelリリースで、ルート定義の2番目のEloquentモデルを前のEloquentモデルの子になるように制限したい場合があったとしましょう。例として、特定ユーザーのブログ記事をスラッグで取得するルート定義について考えてみましょう。

use App\Models\Post;
use App\Models\User;

Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
    return $post;
});

ネストしたルートパラメータとして、カスタムキー付きの暗黙の結合を使用する場合、Laravelは親のリレーション名を推測する命名規約を使用することにより、ネストしたモデルを取得するためのクエリを自動的に制限します。しかし、この動作は以前、カスタムキーが子ルートの結合に使用されたときのみ、Laravelはサポートしていました。

しかし、Laravel9.xでは、カスタムキーが提供されない場合でも、Laravelに「子」結合を限定するよう指示できるようになりました。これを行うには、ルートの定義でscopeBindingsメソッドを呼び出します。

use App\Models\Post;
use App\Models\User;

Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
    return $post;
})->scopeBindings();

また、ルート定義のグループ全体へ、スコープ付き結合を使用するように指示することもできます。

Route::scopeBindings()->group(function () {
    Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
        return $post;
    });
});

コントローラルートグループ

ルートグループの改良は、Luke Downingが貢献しました。

controller メソッドにより、グループ内のすべてのルートに共通のコントローラを定義できるようになりました。それにより、ルート定義時に呼び出すコントローラメソッドを指定するだけでよくなりました。

use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {
    Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');
});

フルテキストインデックス/WHERE句

全文インデックスと"WHERE"句は、Taylor OtwellDries Vintsの貢献です。

MySQLかPostgreSQLを使用している場合、カラム定義でfullTextメソッドを追加し、フルテキストインデックスを生成できるようにしました。

$table->text('bio')->fullText();

さらに、whereFullTextorWhereFullTextメソッドを使用すると、フルテキストインデックス を持つカラムのクエリに、フルテキストの"WHERE"節を追加できます。これらのメソッドは、裏で動作するデータベースシステムに適したSQLへ、Laraelが変換します。例えば、MySQLを利用するアプリケーションでは、MATCH AGAINST句を生成します。

$users = DB::table('users')
           ->whereFullText('bio', 'web developer')
           ->get();

Laravel Scoutデータベースエンジン

Laravel Scoutデータベースエンジンは、Taylor OtwellDries Vintsが、貢献しました。

中小規模のデータベースを操作するアプリケーションや、作業負荷が軽いアプリケーションでは、AlgoliaやMeiliSearchのような専用の検索サービスではなく、Scoutで「データベース」エンジンを利用できるようにしました。データベースエンジンは、既存のデータベースから検索結果をフィルタリングするとき、"WHERE LIKE"句と全文インデックスを使用して、クエリの検索結果を決定します。

Scoutデータベースエンジンの詳細は、Scoutのドキュメントを参照してください。

インラインBladeテンプレートのレンダ

インラインBladeテンプレートのレンダは、Jason Beggsが貢献しました。インラインBladeコンポーネントのレンダは、Toby Zernerが貢献しました。

素のBladeテンプレート文字列を有効なHTMLへ変換する必要が起きることもあるでしょう。このような場合は、Bladeファサードが提供するrenderメソッドを使用します。renderメソッドはBladeテンプレート文字列と、テンプレートに提供するデータの配列をオプションで受け取ります。

use Illuminate\Support\Facades\Blade;

return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);

同様に、renderComponentメソッドは、クラスコンポーネントのインスタンスをメソッドへ渡し、レンダするために使用します。

use App\View\Components\HelloComponent;

return Blade::renderComponent(new HelloComponent('Julian Bashir'));

スロット名の短期法

スロット名の短期法は、Caleb Porzioの貢献です。

以前のLaravelリースでは、スロット名をx-slotタグのname属性で指定していました。

<x-alert>
    <x-slot name="title">
        Server Error
    </x-slot>

    <strong>Whoops!</strong> Something went wrong!
</x-alert>

しかし、Laravel9.xからは、スロットの名前を便利な短期法で指定できます。

<x-slot:title>
    Server Error
</x-slot>

Checked / Selected Blade Directives

*checkedとselected Bladeディレクティブは、Ash AllenTaylor Otwellの貢献です。

利便が良いよう、指定したHTMLのチェックボックス入力が"checked"であることを簡単に表すため、@checkedディレクティブを使用できます。このディレクティブは、指定条件がtrueと評価された場合、checkedをechoします。

<input type="checkbox"
        name="active"
        value="active"
        @checked(old('active', $user->active)) />

同様に、@selectedディレクティブは、特定のセレクトオプションが"selected"であることを表すために使用します。

<select name="version">
    @foreach ($product->versions as $version)
        <option value="{{ $version }}" @selected(old('version') == $version)>
            {{ $version }}
        </option>
    @endforeach
</select>

Bootstrap5ペジネーションビュー

Bootstrap5ペジネーションビューは、Jared Lewisの貢献です

Laravelは、Bootstrap5を使用したペジネーションビューを用意しました。デフォルトのTailwindビューの代わりにこのビューを使うには、App\Providers\AppServiceProviderクラスのbootメソッド内で、ペジネタのuseBootstrapFiveメソッドを呼び出してください。

use Illuminate\Pagination\Paginator;

/**
 * 全アプリケーションサービスの初期起動処理
 *
 * @return void
 */
public function boot()
{
    Paginator::useBootstrapFive();
}

ネストした配列データのバリデーション向上

ネストした配列入力のバリデーションの向上は、Steve Baumanが貢献しました。

バリデーションルールを属性へ割り当てるとき、ネストした配列要素の値へアクセスする必要があることがあります。このような場合には、Rule::forEachメソッドを使います。forEachメソッドは、バリデーション対象の配列属性の繰り返しごとに呼び出されるクロージャを受け取り、属性の値と完全に展開された明確な属性名を受け取ります。クロージャは、配列の要素へ割り当てるルールの配列を返す必要があります。

use App\Rules\HasPermission;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

$validator = Validator::make($request->all(), [
    'companies.*.id' => Rule::forEach(function ($value, $attribute) {
        return [
            Rule::exists(Company::class, 'id'),
            new HasPermission('manage-company', $value),
        ];
    }),
]);

Laravel Breeze APIとNext.js

Laravel Breeze APIスカフォールドとNext.jsスターターキットは、Taylor OtwellMiguel Piedrafitaの貢献です。

Laravel Breezeスターターキットに「API」スカフォールドモードと賞賛すべきNext.jsフロントエンド実装を追加しました。このスターターキットのスカフォールドはバックグラウンドとして動作するLaravelアプリケーションや、Laravel Sanctum認証APIのJavaScriptフロントエンドのジャンプスタートに利用できるでしょう。

Ignition例外ページの向上

Ignitionは、Spatieが開発しています。

Spatieが開発しているオープンソースの例外デバッグページ、Ignitionが一から設計し直されました。新しくなったIgnitionはLaravel9.xに同梱され、ライト/ダークテーマ、カスタマイズ可能な「エディタで開く」機能などが用意されました。

route:list CLI表示の向上

route:listのCLI出力の改良は、Nuno Maduroの貢献です。

Laravel9.xリリースでは、route:list CLI表示を大幅に改善し、ルート定義の表示の際に素晴らしいエクスペリエンスを提供します。

Artisan testコマンドを使ったテストカバレージ

Artisan testコマンド使用のテストカバレッジは、Nuno Maduroの貢献です。

Artisan の test コマンドに、新たに--coverageオプションを追加し、アプリケーションに用意したテストのコードカバレッジの量を調べられるようになりました。

php artisan test --coverage

テストカバレッジの結果は、CLI出力内に直接表示しています。

さらに、満たすべき最小のテストカバレッジパーセンテージの閾値を指定する場合は、--min オプションを使用します。指定した最小閾値を満たさない場合、テストスイートは失敗します。

php artisan test --coverage --min=80.3

Soketi サーバ

Soketi Echoサーバは、Alex Renokiが開発しました。

Laravel9.x専用ではありませんが、最近LaravelはNode.js用に書かれたLaravel Echo対応のWeb Socketサーバ、Soketiのドキュメント作成を支援しました。Soketiは、PusherやAblyに代わる、素晴らしいオープンソースのWeb Socketサーバを提供します。

Soketiの使い方は、ブロードキャストのドキュメントおよび[Soketiのドキュメント](https://docs.soketi.app/ を参照してください。

コレクションとIDEサポートの向上

コレクションとIDEサポートの向上は、Nuno Maduroの貢献です。

Laravel9.xは、改良した「ジェネリック」スタイルの型定義をコレクションコンポーネントへ追加し、IDEと静的解析へのサポートを向上しました。PHPStormなどのIDEや、PHPStanなどの静的解析ツールは、Laravelコレクションをより自然に理解できるようになりました。

新ヘルパ

Laravel 9.xでは、皆さん自身のアプリケーションでも使ってもらえる、便利なヘルパ関数を2つ導入しました。

str

str関数は、指定した文字列に対する新しいIlluminate\Support\Stringableインスタンスを返します。この関数は、Str::ofメソッドと等価です。

$string = str('Taylor')->append(' Otwell');

// 'Taylor Otwell'

str関数へ、引数を指定しなかった場合、この関数はIlluminate\Support\Strインスタンスを返します。

$snake = str()->snake('LaravelFramework');

// 'laravel_framework'

to_route

to_route関数は、指定名前付きルートへのリダイレクトHTTPレスポンスを生成し、ルートやコントローラから名前付きルートへリダイレクトするための表現力豊かな手法を提供しています。

return to_route('users.show', ['user' => 1]);

必要に応じ、リダイレクトへ割り当てるHTTPステータスコードと追加のレスポンスヘッダを、to_routeメソッドの第3、第4引数へ渡せます。

return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュを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)へ移動

その他

?

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