Laravel 5.8 リリースノート

バージョニング規約

Laravelのバージョニングは、「パラダイム.メジャー・マイナー」の規約を維持しています。メジャーフレームワークリリースは、1月と6月の半年ごとにリリースします。一方、マイナーリリースは毎週のように、頻繁にリリースされます。マイナーリリースは、ブレーキングチェンジを絶対に含めません。

アプリケーションやパッケージで、Laravelフレームワークやコンポーネントを利用する場合、常に5.7.*のようにバージョンを指定してください。理由は上記の通り、Laravelのメジャーリリースは、ブレーキングチェンジを含んでいるからです。新しいメジャーリリースへの更新は、一日かからない程度になるように努力しています。

パラダイムシフトリリースは数年空けています。これはフレームワークの構造と規約に重要な変更が起きたことを表します。現在、パラダイムシフトリリースは開発されていません。

サポートポリシー

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

バージョン リリース バグフィックス期限 セキュリティフィックス期限
5.0 2015年2月4日 2015年8月4日 2016年2月4日
5.1 (LTS) 2015年5月9日 2017年6月9日 2018年6月9日
5.2 2015年12月21日 2016年6月21日 2016年12月21日
5.3 2016年8月23日 2017年2月23日 2017年8月23日
5.4 2017年1月24日 2017年7月24日 2018年1月24日
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日

Laravel5.8

Laravel5.8は5.7で行われた改善を継続しています。今回のバージョンでは、"HasOneThrough" Eloquentリレーションの導入、規約ベースの認可ポリシーの自動登録の導入、DynamoDBキャッシュとセッションドライバーのサポート、メールバリデーションの改良、スケジューラーのタイムゾーン設定のサポート、ブロードキャストチャンネルに対する複数認可ガード指定のサポート、PSR-16キャッシュドライバー準拠、artisan serveコマンドの向上、PHPUnit8.0のサポート、Carbon2.0サポート、Pheanstalk4.0サポートと、様々なバグフィックス並びに不安定の改善が行われました。

Eloquent HasOneThroughリレーション

EloquentにhasOneThroughリレーションタイプのサポートを提供始めました。例として、サプライヤ(Supplier)モデルがアカウント(Account)モデルを一つ持ち(hasOne)、アカウントモデルもアカウント履歴(AccountHistory)モデルを一つ持っているとイメージしてください。サプライヤのアカウント履歴にアクセスするために、アカウントモデルを経由し、hasOneThroughリレーションが利用できます。

/**
 * サプライヤに対するアカウント履歴を取得
 */
public function accountHistory()
{
    return $this->hasOneThrough(AccountHistory::class, Account::class);
}

モデルポリシーの自動検出

Laravel5.7を使う場合は、モデルに対応する認可ポリシーをアプリケーションのAuthServiceProviderで明示的に登録する必要がありました。

/**
 * アプリケーションに対するポリシーマッピング
 *
 * @var array
 */
protected $policies = [
    'App\User' => 'App\Policies\UserPolicy',
];

Laravel5.8ではモデルポリシーの自動検出が導入され、モデルとポリシーの標準命名規則に従っているポリシーを自動的にLaravelは見つけます。具体的にはモデルが含まれているディレクトリの下に存在する、Policiesディレクトリ中のポリシーです。たとえば、モデルがappディレクトリ下にあれば、ポリシーはapp/Policiesディレクトリへ置く必要があります。さらに、ポリシーの名前は対応するモデルの名前へ、Policyサフィックスを付けたものにする必要があります。ですから、Userモデルに対応させるには、UserPolicyクラスと命名します。

独自のポリシー発見ロジックを利用したい場合、Gate::guessPolicyNamesUsingメソッドでカスタムコールバックを登録します。通常このメソッドは、AuthServiceProviderから呼び出すべきでしょう。

use Illuminate\Support\Facades\Gate;

Gate::guessPolicyNamesUsing(function ($modelClass) {
    // ポリシークラス名を返す…
});

Note: AuthServiceProvider中で明確にマップされたポリシーは、自動検出される可能性のあるポリシーよりも優先的に扱われます。

PSR-16キャッシュ準拠

より細かい時間でアイテムの保存時間を扱えるように、そしてPSR-16キャッシュ基準に準拠するために、キャッシュの保存時間は分から秒単位になりました。Illuminate\Cache\Repositoryクラスとこれを拡張したクラスのputputManyaddremembersetDefaultCacheTimeメソッド、並びに各キャッシュ保存のputメソッドはこの動作変更へ更新されました。詳細は、関係するPRをご覧ください。

前述のメソッドに整数値を渡している場合、キャッシュにアイテムを残したい時間が秒数になったことに留意し、コードを変更してください。言い換えれば、アイテムの期限がいつ切れるかを表すDateTimeインスタンスを渡したほうが良いでしょう。

// Laravel5.7:30分アイテムは保存される
Cache::put('foo', 'bar', 30);

// Laravel5.8:30秒アイテムは保存される
Cache::put('foo', 'bar', 30);

// Laravel5.7と5.8:30秒アイテムは保存される
Cache::put('foo', 'bar', now()->addSeconds(30));

複数のブロードキャスト認可ガード

Laravelの以前のリリースでは、プライベートとプレゼンス・ブロードキャスト・チャンネルは、アプリケーションのデフォルト認証ガードにより、ユーザーを認証していました。Laravel5.8からは、受信したリクエストを認可する複数のガードを指定できるようになりました。

Broadcast::channel('channel', function() {
    // ...
}, ['guards' => ['web', 'admin']])

tokenガードとトークンのハッシュ

Laravelのtokenガードは基本的なAPI認証を提供していますが、SHA-256ハッシュの文字列APIトークンをサポートするようになりました。これにより、保存された平文トークンよりもセキュリティが向上しました。ハッシュ済みトークンの詳細は、API認証のドキュメントで確認してください。

Note: Laravelではシンプルなトークンベースの認証ガードを提供していますが、API認証を提供する堅牢なプロダクションアプリケーションでは、Laravel Passportの使用をAPI認証ではおすすめします。

メールバリデーションの向上

Laravel5.8では、SwiftMailerが使用しているegulias/email-validatorパッケージを採用し、バリデータのメールバリデーションを向上しました。Laravelの以前のメールバリデーションロジックでは、example@bär.seなど有効なEメールアドレスを時に無効と判断していました。

スケジューラのデフォルトタイムゾーン

Laravelではtimezoneメソッドを使うことで、一つのスケジュールタスクのタイムゾーンをカスタマイズできました。

$schedule->command('inspire')
         ->hourly()
         ->timezone('America/Chicago');

しかしながら、スケジュール済みの全タスクに対して、同じタイムゾーンを指定する場合、繰り返しの手間がかかっていました。そのため、app/Console/Kernel.phpファイルでscheduleTimezoneメソッドを定義できるようになりました。このメソッドは、スケジュールタスクに対し指定する、デフォルトのタイムゾーンを返します。

/**
 * スケジュール済み全イベントに対するデフォルトのタイムゾーンを取得
 *
 * @return \DateTimeZone|string|null
 */
protected function scheduleTimezone()
{
    return 'America/Chicago';
}

中間テーブル/ピボットモデルイベント

以前のバージョンのLaravelでは、多対多リレーションのカスタム中間テーブル/ピボット("pivot")モデルのアタッチ(attach)、デタッチ(detach)、同期(sync)時にEloquentモデルイベントはディスパッチされませんでした。Laravel5.8のカスタム中間テーブルモデルを使用する場合、これらのイベントがディスパッチされるようになりました。

Artisan callの向上

LaravelではArtisanをArtisan::callメソッドにより起動できます。以前のLaravelリリースでは、メソッドの第2引数として、配列でコマンドオプションを渡していました。

use Illuminate\Support\Facades\Artisan;

Artisan::call('migrate:install', ['database' => 'foo']);

Laravel5.8では、メソッドの第1引数へ、オプションを含めたコマンド全体を渡せるようになりました。

Artisan::call('migrate:install --database=foo');

mock/spyテストヘルパメソッド

モックオブジェクトをより便利にするため、ベースのLaravelテストケースクラスへ新しくmockspyメソッドを追加しました。これらのメソッドは自動的にモッククラスをコンテナへ結合します。例をご覧ください。

// Laravel5.7
$this->instance(Service::class, Mockery::mock(Service::class, function ($mock) {
    $mock->shouldReceive('process')->once();
}));

// Laravel5.8
$this->mock(Service::class, function ($mock) {
    $mock->shouldReceive('process')->once();
});

Eloquentリソースキーの保持

ルートよりEloquentリソースコレクションが返されるとき、Laravelはコレクションのキーをシンプルな数値順へリセットします。

use App\User;
use App\Http\Resources\User as UserResource;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});

Laravel5.8を使用する場合、リソースクラスにpreserveKeysプロパティを追加し、コレクションのキーの保持をLaravelへ指示してください。以前のLaravelリリースと一貫性を保つために、デフォルトでキーはリセットされます。

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * リソースコレクションのキーの保持を指定
     *
     * @var bool
     */
    public $preserveKeys = true;
}

preserveKeysプロパティがtrueのとき、コレクションキーは保持されます。

use App\User;
use App\Http\Resources\User as UserResource;

Route::get('/user', function () {
    return UserResource::collection(User::all()->keyBy->id);
});

Higher Order orWhere Eloquentメソッド

以前のリリースのLaravelでは、複数のEloquentモデルスコープを結合するために、orクエリ操作でクロージャコールバックを使用する必要がありました。

// scopePopularとscopeActiveメソッドは、Userモデルで定義済み
$users = App\User::popular()->orWhere(function (Builder $query) {
    $query->active();
})->get();

Laravel5.8では、"higher order" orWhereメソッドが導入され、クロージャを使用することなく、スコープをすらすらとチェーンできます。

$users = App\User::popular()->orWhere->active()->get();

Artisan Serveの向上

以前のLaravelリリースでArtisan serveコマンドは、ポート8000固定でアプリケーションのサーバ動作していました。他のserveコマンドプロセスが既にこのポートをリッスンしている場合、次に起動を試みたserveは失敗していました。Laravel5.8から複数のアプリケーションを一度にサーバ動作できるように、serveは最大で8009ポートまで利用可能なポートをスキャンするようになりました。

Bladeファイルのマッピング

Bladeテンプレートをコンパイルするとき、Laravelはコンパイル済みファイルの先頭へ、オリジナルのBladeテンプレートへのパスを含めるようになりました。

DynamoDBキャッシュ/セッションドライバ

Laravel5.8からDynamoDBキャッシュとセッションドライバが導入されました。DynamoDBはAmazon Web Servicesが提供する、サーバレスNoSQLデータベースです。dynamodbキャッシュドライバーのデフォルト設定は、Laravel5.8のキャッシュ設定ファイルで確認できます。

Carbon2.0サポート

Laravel5.8は、Carbon日付操作ライブラリの~2.0リリースをサポートしました。

Pheanstalk4.0サポート

Laravel5.8はPheanstalkキューライブラリの~4.0リリースをサポートしました。Pheanstalkライブラリをアプリケーションで利用している場合は、Composerで~4.0リリースへアップグレードしてください。

ドキュメント章別ページ

ヘッダー項目移動

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

その他

?

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