バージョニング規約
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.2 | 2022年2月8日 | 2023年8月8日 | 2024年2月6日 |
10 | 8.1 - 8.2 | 2023年第一四半期 | 2024年8月6日 | 2025年2月4日 |
(*) 対応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 Vints、James Brooks、Julius 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 OtwellとDries Vintsの貢献です。
MySQLかPostgreSQLを使用している場合、カラム定義でfullText
メソッドを追加し、フルテキストインデックスを生成できるようにしました。
$table->text('bio')->fullText();
さらに、whereFullText
とorWhereFullText
メソッドを使用すると、フルテキストインデックス
を持つカラムのクエリに、フルテキストの"WHERE"節を追加できます。これらのメソッドは、裏で動作するデータベースシステムに適したSQLへ、Laraelが変換します。例えば、MySQLを利用するアプリケーションでは、MATCH AGAINST
句を生成します。
$users = DB::table('users')
->whereFullText('bio', 'web developer')
->get();
Laravel Scoutデータベースエンジン
Laravel Scoutデータベースエンジンは、Taylor OtwellとDries 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 AllenとTaylor 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 OtwellとMiguel 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']);