[Laravel] 5.7がリリースされました

laravel/frameworkのバージョン5.7がリリースされました。更新された機能について確認していきます。

Laravel 5.7では以下の用な更新が行われています。

  • Laravel Novaへの対応
  • ユーザーのメールアドレスの検証機能の追加
  • GateやPolicyといった認証に関わる部分でのゲストユーザをサポートする機能の追加
  • Artisanコマンドのテスト方法の改善
  • Symfonyを使用したDump Serverの統合
  • Notificationのローカライズ対応
  • その他のバグの修正、およびユーザビリティの向上

メールアドレスの検証

Laravel 5.7では、フレームワークに含まれている認証用テンプレートにオプションのメールアドレスの検証が追加されました。

この機能に対応するために、フレームワークに含まれているデフォルトのユーザーテーブルのmigrationにemail_verified_atタイムスタンプ列が追加されています。

新しく登録したユーザーにメールアドレスの検証を促すには、UserモデルにMustVerifyEmailインターフェイスを設定する必要があります。

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail
{
    // ...
}

UserモデルにMustVerifyEmailインターフェイスが設定されると、新しく登録されたユーザーには、署名付きの確認リンクが記載されたメールが送信されます。

このリンクがクリックされると、Laravelは検証時間を自動的にデータベースに記録します。

verifiedミドルウェアがデフォルトのアプリケーションのHTTPカーネルに追加されました。このミドルウェアは、検証されたユーザーのみを許可することができます。

'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

詳細についてはこちらをご確認ください

ゲストユーザーのGate/Policy

Laravelの以前のバージョンでは、未認証GateとPolicyはアプリケーションが自動的にfalseを返しました。ただしOptional型のタイプヒンティングを宣言するか、nullのデフォルト値を指定することで、ゲストが認可を通過できるようになりました。

Gate::define('update-post', function (?User $user, Post $post) {
    // ...
});

Symfony Dump Server

Laravel 5.7は、 beyondcode/laravel-dump-serveのパッケージを使用してSymfonyのDump Serverと統合されました。利用するには、Artisanコマンドのdump-serverを実行します。

php artisan dump-server

Dump Serverが起動すると、ダンプするすべての呼び出しは、ブラウザーではなくコンソール・ウィンドウに表示され、HTTP応答出力をマ待つこと無く値を検査することができます。

Notificationのローカリゼーション

Laravelでは、現在の言語以外のロケールで通知を送信できるようになり、通知がキューに送る場合でもこのロケールを指定可能です。

これを実現するために、Illuminate\Notifications\Notificationクラスは、目的の言語を設定するためのlocale()メソッドが追加されました。通知がフォーマットされると、アプリケーションはこのロケールに変更され、フォーマットが完了すると以前のロケールに戻ります。

$user->notify((new InvoicePaid($invoice))->locale('es'));

複数の通知エントリのローカライズは、Notificationファサードを介して行うこともできます。

Notification::locale('es')->send($users, new InvoicePaid($invoice));

Artisanコマンドのテスト

Laravel 5.7では、expectsQuestionメソッドを使用してArtisanコマンドのユーザー入力を簡単にモック化できます。

また、assertExitCodeおよびexpectsOutputメソッドを使用して、Artisanコマンドによって出力されると予想される終了コードおよびテキストを指定することもできます。

たとえば、次のArtisanコマンドを例にします。

Artisan::command('question', function () {
    $name = $this->ask('What is your name?');

    $language = $this->choice('Which language do you program in?', [
        'PHP',
        'Ruby',
        'Python',
    ]);

    $this->line('Your name is '.$name.' and you program in '.$language.'.');
});

expectsQuestionexpectsOutput、およびassertExitCodeメソッドを使用する次のテストでこのコマンドをテストできます。

/**
 * Test a console command.
 *
 * @return void
 */
public function test_console_command()
{
    $this->artisan('laracon')
         ->expectsQuestion('What is your name?', 'Taylor Otwell')
         ->expectsQuestion('Which language do you program in?', 'PHP')
         ->expectsOutput('Your name is Taylor Otwell and you program in PHP.')
         ->assertExitCode(0);
}

URL Generatorがコールバックに対応しました

LaravelのURLジェネレータは、文字列を受け入れるだけでなく、コントローラアクションのURLを生成する際に、callableな構文を受け入れるようになりました。

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

Paginator Links

Laravel 5.7では、ページネーションの両側に表示されるリンクの数を制御できます。

デフォルトでは、プライマリページリンクの各サイドに3つのリンクが表示されます。

ただし、onEachSideメソッドを使用してこの数を制御できます。

{{ $paginator->onEachSide(5)->links() }}

Filesystem Read / Write Streams

LaravelのFlysystemで、readStreamメソッドとwriteStreamメソッドが利用可能になりました。

Storage::disk('s3')->writeStream(
   'remote-file.zip',
   Storage::disk('local')->readStream('local-file.zip')
);

詳しい内容については以下を確認してください。

Release Notes - Laravel - The PHP Framework For Web Artisans

© Xzxzyzyz