Laravel 7.x リリースノート

バージョニング規約

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

皆さんのアプリケーションやパッケージからLaravelフレームワークかコンポーネントを参照する場合は、Laravelのメジャーリリースはブレーキングチェンジを含まないわけですから、^7.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日
7 2020年3月3日 2020年9月3日 2021年3月3日

Laravel 7

Laravel7は、Laravel6.xで行われた向上に加え、以降の変更で構成されています。Laravel Sanctumの導入、ルーティングスピードの向上、カスタムEloquentキャスト、Bladeコンポーネントタグ、Fluentな文字列操作、開発者に焦点を当てたHTTPクライアント、ファーストパーティCORSサポート、ルートモデル結合の制約の向上、スタブのカスタマイズ、ならびに多くのバグフィックスとユーザービリティの向上です

Laravel Sanctum

Laravel SanctumはTaylor Otwellにより構築されました。

Laravel Sanctum(サンクタム:聖所)はSPA(Single Page Applications)のための、シンプルでトークンベースのAPIを使った羽のように軽い認証システムです。Sanctumはアプリケーションのユーザーのアカウントごとに、複数のAPIトークンを生成できます。これらのトークンには、実行可能なアクションを限定するアビリティ・スコープを与えられます。

Laravel Sanctumの詳細は、Sanctumのドキュメントで確認してください。

カスタムEloquentキャスト

カスタムEloquentキャストはTaylor Otwellにより構築されました。

Laravelには多様な利便性のあるキャストタイプが用意されています。しかし、自分自身でキャストタイプを定義する必要が起きることもまれにあります。これを行うには、CastsAttributesインターフェイスを実装したクラスを定義してください。

このインターフェイスを実装するクラスでは、getsetメソッドを定義します。getメソッドはデータベースにある元の値をキャストした値へ変換することに責任を持ちます。一方のsetメソッドはキャストされている値をデータベースに保存できる元の値に変換します。例として、組み込み済みのjsonキャストタイプをカスタムキャストタイプとして再実装してみましょう。

<?php

namespace App\Casts;

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class Json implements CastsAttributes
{
    /**
     * 指定された値をキャストする
     *
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @param  string  $key
     * @param  mixed  $value
     * @param  array  $attributes
     * @return array
     */
    public function get($model, $key, $value, $attributes)
    {
        return json_decode($value, true);
    }

    /**
     * 指定された値を保存用に準備
     *
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @param  string  $key
     * @param  array  $value
     * @param  array  $attributes
     * @return string
     */
    public function set($model, $key, $value, $attributes)
    {
        return json_encode($value);
    }
}

カスタムキャストタイプが定義できたら、クラス名を使いモデル属性へ指定します。

<?php

namespace App;

use App\Casts\Json;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ネイティブなタイプへキャストする属性
     *
     * @var array
     */
    protected $casts = [
        'options' => Json::class,
    ];
}

カスタムEloquentキャストの書き方は、Eloquentドキュメントで調べてください。

Bladeコンポーネントタグと向上

BladeコンポーネントタグはSpatieMarcel PociotCaleb PorzioDries VintsTaylor Otwellから貢献を受けました。

Tip!! Bladeコンポーネントはタグベースのレンダリング、属性管理、コンポーネントクラス、インラインビューコンポーネントなどを実現するためにオーバーホールされました。Bladeコンポーネントのオーバーホールは広範囲に及んでいるため、この機能を学ぶためにBladeコンポーネント全体を確認してください。

要約すれば、コンポーネントは、受け取るデータを指定する関連付けしたクラスが持てるようになりました。コンポーネントクラス上にあるパブリックのプロパティとメソッドはすべて自動的にコンポーネントビューで利用できます。コンポーネント上で指定された、追加のHTML属性は属性バッグインスタンスである$attributes変数で自動的に管理できます。

たとえば、App\View\Components\Alertコンポーネントが定義されていると仮定しましょう。

<?php

namespace App\View\Components;

use Illuminate\View\Component;

class Alert extends Component
{
    /**
     * alertタイプ
     *
     * @var string
     */
    public $type;

    /**
     * コンポーネントインスタンスの生成
     *
     * @param  string  $type
     * @return void
     */
    public function __construct($type)
    {
        $this->type = $type;
    }

    /**
     * 指定されたalertタイプに対するクラスを取得
     *
     * @return string
     */
    public function classForType()
    {
        return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';
    }

    /**
     * コンポーネントを表すビュー/コンテンツを取得
     *
     * @return \Illuminate\View\View|string
     */
    public function render()
    {
        return view('components.alert');
    }
}

そして、関連するコンポーネントBladeテンプレートを以下のように定義してあるとしましょう。

<!-- /resources/views/components/alert.blade.php -->

<div class="alert {{ $classForType }}" {{ $attributes }}>
    {{ $heading }}

    {{ $slot }}
</div>

このコンポーネントは他のBladeビューでコンポーネントタグを使用し、レンダーされるでしょう。

<x-alert type="error" class="mb-4">
    <x-slot name="heading">
        Alertコンテント…
    </x-slot>

    デフォルトスロットの内容…
</x-alert>

紹介したのはLaravel7で行ったBladeコンポーネントのオーバーホールの小さなサンプルであり、無名コンポーネント、インラインビューコンポーネントや他の数々の機能はデモンストレートしていません。この機能を学ぶには、どうぞBladeコンポーネントの完全なドキュメントを調べてください。

Note: 以前の@component Bladeコンポーネント記法は残っていますし、削除予定もありません。

HTTPクライアント

HTTPクライアントはGuzzleのラッパーであり、Adam WathanJason McCrearyTaylor Otwellから貢献を受けました。

他のWebアプリケーションと連携を取る、送信HTTPリクエストを簡単に作成できるよう、Laravelは小さくて読み書きしやすいGuzzle HTTPクライアントのAPIを提供しています。LaravelのGuzzleラッパーはもっとも繁用されるユースケースと開発者が素晴らしい体験をできることに重点を置いています。例として、クライアントでJSONデータを送るPOSTを簡単に作ってみましょう。

use Illuminate\Support\Facades\Http;

$response = Http::withHeaders([
    'X-First' => 'foo',
    'X-Second' => 'bar'
])->post('http://test.com/users', [
    'name' => 'Taylor',
]);

return $response['id'];

さらに、このHTTPクライアントは豊富な素晴らしいテスト機能を備えています。

Http::fake([
    // GitHubエンドポイントに対するJSONレスポンスをスタブ
    'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']),

    // Googleエンドポイントに対する文字列レスポンスをスタブ
    'google.com/*' => Http::response('Hello World', 200, ['Headers']),

    // GitHubエンドポイントに対して一連のレスポンスをスタブ
    'facebook.com/*' => Http::sequence()
                            ->push('Hello World', 200)
                            ->push(['foo' => 'bar'], 200)
                            ->pushStatus(404),
]);

HTTPクライアントの機能すべてについて学習するには、HTTPクライアントドキュメントを調べてください。

Fluent文字列操作

Fluent文字列操作は、Taylor Otwellから貢献を受けました。

LaravelにもともとあるIlluminate\Support\Strクラスには皆さん慣れているでしょう。役に立つ、さまざまな文字列操作機能を提供しています。Laravel7ではよりオブジェクト指向で読み書きしやすい(Fluent)文字列操作ライブラリをこうした機能上に構築しました。FluentなIlluminate\Support\Stringableオブジェクトは、Str::ofメソッドで生成できます。数多くのメソッドを文字列操作のためにオブジェクトへチェーン可能です。

return (string) Str::of('  Laravel Framework 6.x ')
                    ->trim()
                    ->replace('6.x', '7.x')
                    ->slug();

Fluentな文字列操作により使用できるメソッドの情報は、ドキュメント全体をお読みください。

ルートモデル結合の向上

ルートモデル結合の向上は、Taylor Otwellから貢献を受けました。

キーのカスタマイズ

ときにid以外のカラムを使いEloquentモデルを解決したい場合もあります。そのためLaravel7ではルートパラメータ定義の中でカラムを指定できるようにしました。

Route::get('api/posts/{post:slug}', function (App\Post $post) {
    return $post;
});

自動制約

一つの定義中に複数のEloquentモデルを暗黙的に結合し、2つ目のEloquentモデルが最初のEloquentモデルの子である必要がある場合などでは、その2つ目のモデルを取得したいと思うでしょう。例として、特定のユーザーのブログポストをスラグで取得する場合を想像してください。

use App\Post;
use App\User;

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

カスタムなキーを付けた暗黙の結合をネストしたルートパラメータで使用するとき、親で定義されるリレーションは慣習にしたがい名付けられているだろうとLaravel7は推測し、ネストしたモデルへのクエリを自動的に制約します。この場合、UserモデルにはPostモデルを取得するためにposts(ルートパラメータ名の複数形)という名前のリレーションがあると想定します。

ルートモデル結合の詳細情報は、ルートのドキュメントをご覧ください。

複数メールドライバ

複数メールドライバのサポートは、Taylor Otwellから貢献を受けました。

Laravel7では1つのアプリケーションで複数の「メーラー」を設定できるようになりました。各メーラーはこのファイルの中でオプションや、独自の「トランスポート」でさえも設定しています。これにより、アプリケーションが特定のメッセージを送るため、異なったメールサービスを利用できるようになっています。たとえばアプリケーションで業務メールはPostmarkを使い、一方でバルクメールはAmazon SESと使い分けることができます。

Laravelはmail設定ファイルのdefaultメーラーとして設定されているメーラーをデフォルトで使用します。しかし、特定のメール設定を使用してメッセージを遅るためにmailerメソッドが使用できます。

Mail::mailer('postmark')
        ->to($request->user())
        ->send(new OrderShipped($order));

ルートキャッシュスピードの向上

ルートキャッシュスピードの向上はアップストリームのSymfony貢献者達とDries Vintsから貢献を受けました。

Laravel7にはマッチングコンパイラの新しいメソッドや、route:cache Artisanコマンドによるルートのキャッシュが含まれています。大きなアプリケーション(たとえば800以上のルートを持つアプリケーション)においてシンプルな"Hello World"ベンチマークでは、2倍のスピード向上という結果が出せます。アプリケーションに特別な変更は必要ありません。

CORSサポート

CORSのサポートはBarry vd. Heuvelから貢献を受けました。

Laravel7では、Barry vd. Heuvelが書いた人気のLaravel CORSパッケージを統合し、Cross-Origin Resource Sharing (CORS) OPTIONSリクエストに対するファーストパーティサポートを提供しています。新しいcors設定はデフォルトLaravelアプリケーションスケルトンに含まれています。

Laravel7.xにおけるCORSサポートの詳細は、CORSのドキュメントを調べてください。

クエリ時間キャスト

クエリ時間キャストはMatt Barlowから貢献を受けました。

テーブルから元の値でセレクトするときのように、クエリ実行時にキャストを適用する必要が稀に起きます。例として以下のクエリを考えてください。

use App\Post;
use App\User;

$users = User::select([
    'users.*',
    'last_posted_at' => Post::selectRaw('MAX(created_at)')
            ->whereColumn('user_id', 'users.id')
])->get();

テーブルから元の値でセレクトするときのように、クエリ実行時にキャストを適用する必要が稀に起きます。例として以下のクエリを考えてください。これを行うにはLaravel7で提供しているwithCastsメソッドを使ってください。

$users = User::select([
    'users.*',
    'last_posted_at' => Post::selectRaw('MAX(created_at)')
            ->whereColumn('user_id', 'users.id')
])->withCasts([
    'last_posted_at' => 'date'
])->get();

MySQL8以上でのデータベースキューの向上

MySQLデータベースキューの向上はMohamed Saidから貢献を受けました。

Laravelの以前のリリースでは、databaseキューは実機環境での使用に対して十分堅牢に考えられていないため、デッドロックを起こしていました。しかしながら、Laravel7ではMySQL8以上で裏打ちされたキューにより、このデータベースを使用したアプリケーションで改善されました。FOR UPDATE SKIP LOCKED節とその他のSQLの改善を利用し、高ボリュームの実働アプリケーションでもdatabaseドライバーは安全に使えるようになりました。

Artisan testコマンド

testコマンドは、Nuno Maduroから貢献を受けました。

テスト実行ではphpunitコマンドに加え、test Artisanコマンドも使用できます。Artisanテストランナーは美しいコンソールUXと現在実行中のテストに関するより詳しい情報を提供します。さらにテストに失敗した最初の時点で自動的に停止します。

php artisan test

phpunitコマンドで使用できる引数はすべてArtisan testコマンドにも渡せます。

php artisan test --group=feature

Markdownメールテンプレートの向上

Markdownメールテンプレートの向上はTaylor Otwellから貢献を受けました。

デフォルトMarkdownメールテンプレートはTailwind CSSカラーパレットを基盤としたよりモダンなデザインに一新されました。もちろん、このテンプレートはリソース公開し、アプリケーションのニーズに合わせてカスタマイズできます。

Markdownメールのより詳しい情報は、メールドキュメントをご覧ください。

スタブのカスタマイズ

StubのカスタマイズはTaylor Otwellから貢献を受けました。

Artisanコンソールのmakeコマンドは、コントローラ、マイグレーション、テストのような数多くのクラスを生成するために使われます。これらのクラスは皆さんの入力を元にして、「スタブ」ファイルへ値を埋め込み生成されます。場合により、Aritsanが生成するファイルを少し変更したい場合もあるでしょう。このためLaravel7はstub:publishコマンドで、カスタマイズのためにもっとも一般的なスタブをリソース公開できるようになりました。

php artisan stub:publish

リソース公開されたスタブはアプリケーションのルート下のstubsディレクトリの中に保存されます。そうしたスタブに加えた変更は、名前に対応するArtisan makeコマンドを使用して生成するときに反映されます。

キューのmaxExceptions設定

maxExceptionsプロパティはMohamed Saidから貢献を受けました。

ジョブを何度も再試行するように指定している場合、指定した回数の例外が発生したことをきっかけにしてその再試行を失敗として取り扱いたい場合も起きると思います。Laravel7では、ジョブクラスにmaxExceptionsプロパティを定義してください。

<?php

namespace App\Jobs;

class ProcessPodcast implements ShouldQueue
{
    /**
     * 最大試行回数
     *
     * @var int
     */
    public $tries = 25;

    /**
     * 失敗と判定するまで許す最大例外数
     *
     * @var int
     */
    public $maxExceptions = 3;

    /**
     * ジョブの実行
     *
     * @return void
     */
    public function handle()
    {
        Redis::throttle('key')->allow(10)->every(60)->then(function () {
            // ロックが取得でき、ポッドキャストの処理を行う…
        }, function () {
            // ロックが取得できなかった…場合の処理を行う…
            return $this->release(10);
        });
    }
}

この例の場合、アプリケーションがRedisのロックを取得できない場合は、そのジョブは10秒でリリースされます。そして、25回再試行を継続します。しかし発生した例外を3回処理しなかった場合、ジョブは失敗します。

ドキュメント章別ページ

ヘッダー項目移動

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

その他

?

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