Laravel 6.x リリースノート

バージョニング規約

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

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

サポートポリシー

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

バージョン リリース バグフィックス期限 セキュリティフィックス期限
5.5 (LTS) 2017年8月30日 2019年8月30日 2020年8月30日
5.6 2018年2月7日 2018年8月7日 2019年2月7日
5.7 2018年9月4日 2019年3月4日 2019年9月4日
5.8 2019年2月26日 2019年8月26日 2020年2月26日
6 (LTS) 2019年9月3日 2021年9月3日 2022年9月3日

Laravel 6

Laravel6LTSは、Laravel5.8で行われた向上に加え、以降の変更で構成されています。セマンティックバージョニングの導入、Laravel Vaporとのコンパチビリティ、認可レスポンスの向上、ジョブミドルウェア、レージーコレクション、サブクエリの向上、フロントエンドスカフォールドをlaravel/ui Composerパッケージへ移行、ならびに多くのバグフィックスとユーザービリティの向上です。

セマンティックバージョニング

Laravelフレームワーク(laravel/framework)パッケージが、セマンティックバージョニング規約に準拠しました。すでにこのバージョニング規約に従っている他のLaravelファーストパーティパッケージと統一されました。Laravelのリリースサイクルには変化はありません。

Laravel Vaporコンパチビリティ

Laravel VaporはTaylor Otwellが構築しています。

Laravel6は、Laravelのためのオートスケールされるサーバレス環境のプラットフォームであるLaravel Vaporとのコンパチビリティを提供しました。AWS Lambda上のLaravelアプリケーション管理の複雑さを抽象化し、同時にアプリケーションをSQSキュー、データベース、Redisクラスタ、ネットワーク、CloudFront CDN、その他と接続します。

Ignitionによる例外表示の向上

Laravel6は、Freek Van der HertenとMarcel Pociotによる、例外詳細ページのオープンソースであるIgnitionを採用しています。Ignitionは、Bladeエラーファイルと行番号の処理、一般的な問題に対する実行可能な解決策、コード編集、例外の共有、UXの向上などたくさんの利便性を以前のリリースから提供しています。

認可レスポンスの向上

認可レスポンスの向上は、Gary Greenにより行われました。

以前のリリースのLaravelは、エンドユーザーに対しカスタム認可メッセージを取得し、表示するのが困難でした。これにより、エンドユーザーになぜ特定のリクエストが拒否されるのかをしっかりと説明するのも困難でした。Laravel6では認可レスポンスメッセージと新しいGate::inspectメソッドを使うことでより簡単にできるようになりました。例として、以下のポリシーメソッドをご覧ください。

/**
 * このユーザーが指定したフライトを見ることができるか判定
 *
 * @param  \App\User  $user
 * @param  \App\Flight  $flight
 * @return mixed
 */
public function view(User $user, Flight $flight)
{
    return $this->deny('Explanation of denial.');
}

認可ポリシーのレスポンスとメッセージはGate::inspectメソッドで簡単に取得できます。

$response = Gate::inspect('view', $flight);

if ($response->allowed()) {
    // ユーザーはこのフライトを見る許可がある
}

if ($response->denied()) {
    echo $response->message();
}

さらに、ルートやコントローラで$this->authorizeGate::authorizeのようなヘルパメソッドを使用すると、このカスタムメッセージは自動的にフロントエンドに返されます。

ジョブミドルウェア

ジョブミドルウェアは、Taylor Otwellにより実装されました。

ジョブミドルウェアはキュー済みジョブの実行周りのカスタムロジックをラップできるようにし、ジョブ自身の定形コードを減らします。たとえば、以前のLaravelリリースでは、ジョブのhandleメソッドのロジックで、レート制限コールバックをラップしていました。

/**
 * ジョブの実行
 *
 * @return void
 */
public function handle()
{
    Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function () {
        info('Lock obtained...');

        // ジョブの処理…
    }, function () {
        // ロックが取得できない…

        return $this->release(5);
    });
}

Laravel6ではこのロジックをジョブミドルウェアへ移すことができ、レート制限の責任をhandleメソッドは全く負わなくて済みます。

<?php

namespace App\Jobs\Middleware;

use Illuminate\Support\Facades\Redis;

class RateLimited
{
    /**
     * キュージョブの実行
     *
     * @param  mixed  $job
     * @param  callable  $next
     * @return mixed
     */
    public function handle($job, $next)
    {
        Redis::throttle('key')
                ->block(0)->allow(1)->every(5)
                ->then(function () use ($job, $next) {
                    // ロック取得…

                    $next($job);
                }, function () use ($job) {
                    // ロックが取得できない…

                    $job->release(5);
                });
    }
}

ミドルウェアを作成したら、ジョブのmiddlewareメソッドから返すことで指定できます。

use App\Jobs\Middleware\RateLimited;

/**
 * このジョブが通過する必要のあるミドルウェアの取得
 *
 * @return array
 */
public function middleware()
{
    return [new RateLimited];
}

レージーコレクション

レージーコレクションは、Joseph Silberにより改善されました。

すでに多くの開発者がLaravelの強力なコレクションメソッドを楽しんで利用しています。すでに強力なCollectionクラスを補足するために、LazyCollectionクラスはPHPのPHPジェネレータを活用しています。巨大なデータセットをメモリ使用を抑えて利用する目的のためです。

たとえば、アプリケーションで数ギガバイトのログを処理する必要があり、ログを解析するためにLaravelのコレクションメソッドを活用するとしましょう。ファイル全体をメモリに一度に読み込む代わりに、レイジーコレクションなら毎回ファイルの小さな部分だけをメモリに保持するだけで済みます。

use App\LogEntry;
use Illuminate\Support\LazyCollection;

LazyCollection::make(function () {
    $handle = fopen('log.txt', 'r');

    while (($line = fgets($handle)) !== false) {
        yield $line;
    }
})
->chunk(4)
->map(function ($lines) {
    return LogEntry::fromLines($lines);
})
->each(function (LogEntry $logEntry) {
    // ログエントリーの処理…
});

もしくは、10,000個のEloquentモデルを繰り返し処理する必要があると想像してください。今までのLaravelコレクションでは、一度に10,000個のEloquentモデルすべてをメモリーにロードする必要がありました。

$users = App\User::all()->filter(function ($user) {
    return $user->id > 500;
});

しかし、Laravel6からクエリビルダのcursorメソッドは、LazyCollectionインスタンスを返します。これによりデータベースに対し1つのクエリを実行するだけでなく、一度に1つのEloquentモデルをメモリにロードするだけで済みます。この例では、各ユーザーを個別に繰り返し処理するまでfilterコールバックは実行されず、大幅にメモリ使用量を減らせます。

$users = App\User::cursor()->filter(function ($user) {
    return $user->id > 500;
});

foreach ($users as $user) {
    echo $user->id;
}

Eloquentサブクエリの向上

Eloquentサブクエリの向上は、Jonathan Reininkにより行われました。

Laravel6はデータベースサブクエリのサポートにも、多くの新しい改善と向上を導入しました。例として、フライト(flights)と目的地(destinations)テーブルを想像してください。flightsテーブルは、フライトの目的地への到着時間を意味するarrived_atカラムを持っています。

Laravel6の新しいサブクエリSELECTの機能を使えば、全destinationsと、一番早く目的地へ到着するのフライト名を1回のクエリで取得できます。

return Destination::addSelect(['last_flight' => Flight::select('name')
    ->whereColumn('destination_id', 'destinations.id')
    ->orderBy('arrived_at', 'desc')
    ->limit(1)
])->get();

さらに、クエリビルダのorderBy関数も新しいサブクエリ機能ををサポートしています。この機能を使い、ラストフライトが目的地へいつ到着するかに基づいて全目的地をソートしてみましょう。今回も、これによりデータベースに対し1回のクエリしか実行されません。

return Destination::orderByDesc(
    Flight::select('arrived_at')
        ->whereColumn('destination_id', 'destinations.id')
        ->orderBy('arrived_at', 'desc')
        ->limit(1)
)->get();

Laravel UI

以前のバージョンのLaravelでは通常フロントエンドを提供していましたが、laravel/ui Composerパッケージとして分離されました。これにより、フレームワーク本体より独立し、ファーストパーティのUIスカフォールドとして開発できるようになり、バージョニングも分けることができました。この変更の結果、デフォルトのフレームワークスカフォールドにはBootstrapやVueのコードが無くなり、make:authコマンドも同様にフレームワークから分離しました。

以前のLaravelリリースで提供していたVue/Bootstrapのスカフォールドに戻すには、laravel/uiパッケージをインストールし、ui Artisanコマンドを使用してフロントエンドスカフォールドをインストールします。

composer require laravel/ui --dev

php artisan ui vue --auth

ドキュメント章別ページ

ヘッダー項目移動

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

その他

?

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