Laravel 8.x リリースノート

バージョニング規約

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

皆さんのアプリケーションやパッケージからLaravelフレームワークかコンポーネントを参照する場合は、Laravelのメジャーリリースはブレーキングチェンジを含まないわけですから、^8.0のようにバージョンを常に指定してください。しかし、新しいメジャーリリースへ1日以内でアップデートできるように、私たちは常に努力しています。

サポートポリシー

Laravel6のようなLTSリリースでは、バグフィックスは2年間、セキュリティフィックスは3年間提供します。これらのリリースは長期間に渡るサポートとメンテナンスを提供します。 一般的なリリースでは、バグフィックスは7ヶ月、セキュリティフィックスは1年です。Lumenのようなその他の追加ライブラリでは、最新リリースのみでバグフィックスを受け付けています。また、Laravelがサポートするデータベースのサポートについても確認してください。

バージョン リリース バグフィックス期限 セキュリティフィックス期限
6 (LTS) 2019年9月3日 2021年10月3日 2022年9月3日
7 2020年3月3日 2020年10月6日 2021年3月31日
8 2020年9月8日 2021年4月6日 2021年9月8日

Laravel8

Laravel8は、Laravel7.xで行われた向上に加え、以降の変更で構成されています。Laravel Jetstreamの導入、モデルファクトリクラスの導入、マイグレーションの圧縮の導入、ジョブバッチの導入、レート制限の向上、キューの向上、ダイナミックBladeコンポーネントの導入、Tailwindペジネーションビューの導入、時間テストヘルパの導入、artisan serveの向上、イベントリスナの向上、ならびに多くのバグフィックスとユーザービリティの向上です

Laravel Jetstream

Laravel Jettreamは、Taylor Otwellにより書かれました

Laravel Jetstream和訳)は、Laravelのために美しくデザインされたアプリケーションのスカフォールドです。Jetstreamは、ログイン、ユーザー登録、メール認証、二要素認証、セッション管理、Laravel SanctumによるのAPIサポート、およびオプションのチーム管理など、次のプロジェクトのための完璧なスタートポイントを提供します。Laravel Jetstreamは、以前のLaravelバージョンで利用可能であったレガシーな認証UIのスカフォールドに代わるものであり、改善されています。

JetstreamはTailwind CSSを使用してデザインされており、LivewireInertiaのどちらかのスカフォールドを選択できます。

モデルディレクトリ

コミュニティからの圧倒的な要望により、デフォルトのLaravelアプリケーションのスケルトンにapp/Modelsディレクトリが含まれるようになりました。Eloquentモデルの新しいホームをお楽しみください。関連するジェネレータコマンドはすべて、モデルがapp/Modelsディレクトリ内に存在する仮定のもとに更新されました。ディレクトリが存在しない場合、フレームワークはモデルがappディレクトリ内にあると仮定します。

モデルファクトリクラス

モデルファクトリクラスは、Taylor Otwellが貢献しました

Eloquentモデルファクトリは、クラスベースのファクトリとして完全に書き直され、ファーストクラスのリレーションシップをサポートするように改良されました。たとえば、Laravelに含まれるUserFactoryは次のように書かれています。

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    /**
     * モデルに対応したファクトリの名前
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * モデルのデフォルト状態
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }
}

生成されたモデルで利用できる新しいHasFactoryトレイトのおかげで、モデルファクトリを以下のように利用できます。

use App\Models\User;

User::factory()->count(50)->create();

モデルファクトリは現在、シンプルな PHP クラスになったため、状態遷移はクラスメソッドとして記述できます。さらに、必要に応じて他のヘルパクラスをEloquentモデルファクトリに追加できます。

たとえばUserモデルは、デフォルトの属性値の一つを変更するsuspended状態を持っているとしましょう。ベースファクトリのstateメソッドを使い、状態遷移を定義できます。ステートメソッドには好きな名前を付けてください。つまるところ、これは典型的なPHPのメソッドです。

/**
 * そのユーザーが利用停止であることを表す
 *
 * @return \Illuminate\Database\Eloquent\Factories\Factory
 */
public function suspended()
{
    return $this->state([
        'account_status' => 'suspended',
    ]);
}

状態遷移メソッドを定義したら、以下のように使用します。

use App\Models\User;

User::factory()->count(5)->suspended()->create();

前述のとおり、Laravel8のモデルファクトリはリレーションのファーストクラスをサポートしています。ですから、Userモデルにpostsリレーションがあると仮定し、以下のコードを実行して、3つのポストを持つユーザーを生成できます。

$users = User::factory()
            ->hasPosts(3, [
                'published' => false,
            ])
            ->create();

簡単にアップグレードできるよう、laravel/legacy-factoriesパッケージがリリースされ、Laravel8.x内のモデルファクトリの以前の反復をサポートしています。

リライトしたLaravelのファクトリは、皆さんに気に入ってもらえるような多くの機能が含まれています。モデルファクトリの詳細は、データベーステストのドキュメントを参照してください。

マイグレーションの圧縮

マイグレーションの圧縮は、Taylor Otwellが貢献しました.

アプリケーションを構築するにつれ、時間の経過とともに段々多くのマイグレーションが溜まっていく可能性があります。これにより、マイグレーションディレクトリが数百ものマイグレーションで肥大化するかもしれません。MySQLもしくはPostgreSQLを使用している場合は、マイグレーションを1つのSQLファイルに「圧縮」できます。利用するには、schema:dumpコマンドを実行します:

php artisan schema:dump

// 現在のデータベーススキーマを圧縮し、既存のマイグレーションを削除する
php artisan schema:dump --prune

このコマンドを実行すると、Laravelは「スキーマ」ファイルをdatabase/schemaディレクトリに書き込みます。これにより、データベースをマイグレートしようとするときに他のマイグレーションは実行されず、Laravelは最初にスキーマファイルのSQLを実行します。スキーマファイルのコマンドを実行した後、Laravelはスキーマダンプに圧縮されていない残りのマイグレーションを実行します。

ジョブバッチ

ジョブバッチは、Taylor OtwellMohamed Saidが貢献しました。.

Laravelのジョブバッチ処理機能を使用すると、バッチジョブを簡単に実行し、バッチの実行が完了したときに何らかのアクションを実行できます。

Busファサードの新しいbatchメソッドを使用して、バッチジョブをディスパッチできます。もちろん、バッチ処理は終了コールバックと合わせて使用すると、特に便利です。そのため、thencatchfinallyメソッドにより、バッチの終了コールバックが定義できます。こうしたコールバックはそれぞれ呼び出し時に、Illuminate\Bus\Batchインスタンスを引数に受け取ります。

use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
use Throwable;

$batch = Bus::batch([
    new ProcessPodcast(Podcast::find(1)),
    new ProcessPodcast(Podcast::find(2)),
    new ProcessPodcast(Podcast::find(3)),
    new ProcessPodcast(Podcast::find(4)),
    new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {
    // 全ジョブが実行成功して終了した
})->catch(function (Batch $batch, Throwable $e) {
    // 最初にバッチジョブの失敗が検出された
})->finally(function (Batch $batch) {
    // バッチの実行が終了した
})->dispatch();

return $batch->id;

バッチジョブの詳細は、キューのドキュメントをお読みください。

レート制限の向上

レート制限の向上は、Taylor Otwellが貢献しました.

Laravelのリクエストレート制限機能は、以前のリリースのthrottleミドルウェアAPIとの下位互換性を維持しながら、柔軟性とパワーが強化されています。

レート制限は、RateLimiterファサードのforメソッドを使い定義します。forメソッドの引数は、レート制限名と、このレート宣言を割り当てるルートに適用する制限設定を返すクロージャです。

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

レート制限コールバックは、受信HTTPリクエストインスタンスを引数に受けるため、受信リクエストまたは認証済みユーザーに基づいた適切なレート制限を動的に構築できます。

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

レート制限を任意の値で分割したい場合があります。たとえば、ユーザーが特定のルートにIPアドレスに対し1分あたり100回アクセスすることを許可したい場合です。それには、レート制限を作成するときにbyメソッドを使用します。

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100)->by($request->ip());
});

レート制限は、throttle ミドルウェアを使用してルートまたはルートグループに付加します。スロットルミドルウェアの引数は、ルートに割り付けるレート制限の名前です。

Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/audio', function () {
        //
    });

    Route::post('/video', function () {
        //
    });
});

レート制限の詳細は、ルーティングドキュメントを参照してください。

メンテナンスモードの向上

メンテナンスモードの向上はSpatieからインスピレーションを受け、Taylor Otwellが貢献しました.

以前のLaravelリリースではアプリケーションへのアクセスを許可するIPアドレスの「許可リスト」を使用して、php artisan downメンテナンスモード機能をバイパスできました。この機能は、より単純な「秘密」/トークンによる解決法導入により削除しました。

While in maintenance mode, you may use the secret option to specify a maintenance mode bypass token:メンテナンスモードの間、secretオプションを使用してメンテナンスモードのバイパストークンを指定します。

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

アプリケーションをメンテナンスモードにした後、このトークンに一致するアプリケーションURLへ移行すると、LaravelはブラウザへメンテナンスモードのバイパスCookieを発行します。

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

この隠しルートにアクセスすると、アプリケーションの/ルートへリダイレクトします。ブラウザにクッキーが発行されれば、メンテナンスモードではないときと同じように、アプリケーションを通常通り閲覧できます。

メンテナンスモードビューの事前レンダリング

デプロイ時、php artisan downコマンドを使用する場合、Composerの依存関係またはその他の基礎コンポーネントの更新中にユーザーがアプリケーションへアクセスすることで、エラーが発生する可能性があります。これはアプリケーションがメンテナンスモードであることを確認し、テンプレートエンジンを使用してメンテナンスモードビューを表示するためには、Laravelフレームワークの重要な部分が起動されている必要があるためです。

このためLaravelは、リクエストサイクルの最初に返されるメンテナンスモードビューを事前レンダリングできるようになりました。このビューは、アプリケーションの依存パッケージが読み込まれる前にレンダリングされます。downコマンドのrenderオプションを使用して、選択したテンプレートを事前レンダーできます:

php artisan down --render="errors::503"

ディスパッチクロージャとcatchチェーン

Catchの向上はMohamed Saidが貢献しました.

新しいcatchメソッドを使用し、キュー設定の再試行をすべて使い果たした後に、キュー投入したクロージャが正常に完了しなかった場合に実行する必要があるクロージャを指定できます。

use Throwable;

dispatch(function () use ($podcast) {
    $podcast->publish();
})->catch(function (Throwable $e) {
    // このジョブは失敗した
});

動的Bladeコンポーネント

動的Bladeコンポーネントは、Taylor Otwellが貢献しました.

コンポーネントをレンダーする必要があるが、実行時までどれをレンダーするかわからない場合があります。この状況では、Laravelに組み込まれているdynamic-componentコンポーネントを使用して、ランタイム値や変数に基づきコンポーネントをレンダリングできます。

<x-dynamic-component :component="$componentName" class="mt-4" />

Bladeコンポーネントの詳細は、[Bladeのドキュメント](blade.html#components)をご覧ください。

イベントリスナの向上

イベントリスナの向上は、Taylor OtwellTaylor Otwellが貢献しました.

クロージャベースのイベントリスナは、クロージャをEvent::listenメソッドに渡すだけで登録できるようになりました。Laravelはクロージャを調べ、リスナが処理するイベントのタイプを判別します。

use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;

Event::listen(function (PodcastProcessed $event) {
    //
});

さらに、クロージャベースのイベントリスナは、Illuminate\Events\queueable関数を使用して、キュー可能としてマークされるようになりました。

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;

Event::listen(queueable(function (PodcastProcessed $event) {
    //
}));

キュー投入するジョブと同様に、キューリスナの実行をカスタマイズするonConnectiononQueuedelayメソッドが使用できます。

Event::listen(queueable(function (PodcastProcessed $event) {
    //
})->onConnection('redis')->onQueue('podcasts')->delay(now()->addSeconds(10)));

匿名のキュー済みリスナの失敗を処理する場合は、 queueableリスナを定義するときにcatchメソッドへクロージャを渡してください。

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;
use Throwable;

Event::listen(queueable(function (PodcastProcessed $event) {
    //
})->catch(function (PodcastProcessed $event, Throwable $e) {
    // キュー済みリスナは失敗した
}));

時間テストのヘルパ

時間テストのヘルパはRuby on Railsからインスピレーションを受け、Taylor Otwellが貢献しました.

テスト時、nowIlluminate\SupportCarbon::now()のようなヘルパが返す時間を変更する必要が起き得ます。Laravelの機能テストクラスのベースには、現時刻を操作できるヘルパを用意しています。

public function testTimeCanBeManipulated()
{
    // 未来へ時間移動する
    $this->travel(5)->milliseconds();
    $this->travel(5)->seconds();
    $this->travel(5)->minutes();
    $this->travel(5)->hours();
    $this->travel(5)->days();
    $this->travel(5)->weeks();
    $this->travel(5)->years();

    // 過去へ時間移動する
    $this->travel(-5)->hours();

    // 特定の時刻へ時間移動する
    $this->travelTo(now()->subHours(6));

    // 現在時刻へ戻る
    $this->travelBack();
}

Artisan serveの向上

Artisan serveの向上は、Taylor Otwellが貢献しました。.

Artisan serveコマンドは、ローカルの.envファイル内で環境変数の変更が検出されたとき、自動でリロードするように改善されました。以前は、コマンドを手動で停止して再起動しなければなりませんでした。

Tailwindペジネーションビュー

LaravelのペジネータはデフォルトでTailwind CSSフレームワークを使用するように変更しました。Tailwind CSSは高度にカスタマイズできる低レベルなCSSフレームワークで、オーバーライドのために戦う必要のある煩わしい意見的なスタイルを使用せずに、お誂え向きのデザインを構築するために必要なすべてのビルディングブロックを提供してくれます。もちろん、Bootstrap3と4のビューも利用可能です。

ルートの名前空間の向上

以前のリリースのLaravelでは、RouteServiceProvider$namespaceプロパティを持っていました。このプロパティの値は、コントローラのルート定義やactionヘルパ/URL::actionメソッドの呼び出しに、自動でプレフィックスを付加していました。Laravel8.xでこのプロパティはデフォルトでnullです。これは、Laravelは自動的に名前空間のプレフィクスを付けなくなったことを意味します。そのため、新しいLaravel8.xアプリケーションでは、コントローラルートの定義は標準的なPHPで呼び出し可能な構文を使って定義する必要があります。

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

action関係のメソッドの呼び出しも、同じく呼び出し可能な記法を使ってください。

action([UserController::class, 'index']);

return Redirect::action([UserController::class, 'index']);

Laravel7.xスタイルのコントローラルートのプレフィックスが好みならば、アプリケーションのRouteServiceProviderの中に、$namespaceプレフィックスをただ追加するだけです。

Note: この変更は新しいLaravel8.xアプリケーションでのみ影響します。Laravel7xからアップグレードしたアプリケーションは、RouteServiceProvider$namespaceプロパティを持ったままでしょう。

ドキュメント章別ページ

[API Documentation](/api/8.x)

ヘッダー項目移動

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

その他

?

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