Help us understand the problem. What is going on with this article?

【Laravel7リリース】Laravel 7 Release Notes 日本語訳

Laravel 7 Release Notes

Laravel Airlock

AirlockはSPAやモバイルアプリなどシンプル、トークンAPIを提供する機能的な認証システムです。Airlockはアプリケーションのユーザアカウントに複数のAPIトークンを生成することも可能にしました。これらのトークンはそれぞれの機能やスコップごとに機能します。

Custom Eloquent Casts

Laravel自体は豊富なキャストタイプを持っていますが、あたなはよく自らのキャストタイプを定義したいこともあるでしょうか。Laravel 7はCastsAttributesインターフェイスを実装するクラスを定義すれば、できるようになりました。

このクラスは必ずgetsetメソードを持ち、getはデータベースの生のデータをキャスト値に変換します。一方、setはキャスト値をデータベースの生のデータに変換します。例えば、jsonキャストタイプを作ってみましょう。

class Json implements CastsAttributes
{
    /**
     * Cast the given value.
     *
     * @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);
    }

    /**
     * Prepare the given value for storage.
     *
     * @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
{
    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'options' => Json::class,
    ];
}

Blade Component Tags & Improvements

簡単に言うと、Bladeコンポネートはそれに対応しているクラスを持ち、それぞれのデータを受け入れることが可能になりました。全ての定義されたパブリックプロパーティーとメソードのコンポネートクラスは自動的にコンポネートビューに利用できます。コンポネート中のHTMLの属性は$attributeと言うattributeインスタンスが自動的に追加されます。
例えば、App\View\Components\Alertはこのように定義され

<?php

namespace App\View\Components;

use Illuminate\View\Component;

class Alert extends Component
{
    /**
     * The alert type.
     *
     * @var string
     */
    public $type;

    /**
     * Create the component instance.
     *
     * @param  string  $type
     * @return void
     */
    public function __construct($type)
    {
        $this->type = $type;
    }

    /**
     * Get the class for the given alert type.
     *
     * @return string
     */
    public function classForType()
    {
        return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';
    }

    /**
     * Get the view / contents that represent the component.
     *
     * @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 content...
    </x-slot>

    Default slot content...
</x-alert>

この例はただBlade component機能の中の一部だけで、Laravel 7は他の匿名、インラインビューコンポーネントなどたくさんの機能を改造しました。

HTTP Client

今までLaravelはGuzzle HTTP clientを使用し、HTTPリクエストなどのサービスを提供しています。Laravel 7はGuzzle一番よく使われる機能の部分を抜粋し、より使いやすいため、GuzzleのラッパーのHTTP clientを作りました。例えば、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 clientは素晴らしい、人間にわかりやすいテスト機能も搭載

Http::fake([
    // Stub a JSON response for GitHub endpoints...
    'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']),

    // Stub a string response for Google endpoints...
    'google.com/*' => Http::response('Hello World', 200, ['Headers']),

    // Stub a series of responses for Facebook endpoints...
    'facebook.com/*' => Http::sequence()
                            ->push('Hello World', 200)
                            ->push(['foo' => 'bar'], 200)
                            ->pushStatus(404),
]);

Fluent String Operations

LaravelのIlluminate\Support\Strクラスはもう馴染みな存在になっているでしょう。たくさんの文字列の操作に役に立つメソードがありますよね。Laravel 7はこれらのメソードに基づいて、オブジェクト指向、スムーズな文字列操作のライブラリを作成しました。Str::ofメソードを使って、Illuminate\Support\Stringableインスタンスを使用します。たくさんのメソードはメソードチェンで文字列を操作

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

Route Model Binding Improvements

Key Customization

Eloquentモデルのデータはid以外のコラムを使いたいことがあるでしょうか。Laravel 7はルートパラメータにコラムを指定することを可能に

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

Automatic Scoping

1つのルートに多数のEloquentモデルをバンドする時に、2つ目パラメータは1つ目のパラメータに属するスコップしたい時はあるでしょう。例えば、ある特定のユーザのブログポストの場合とか

use App\Post;
use App\User;

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

Laravel 7はこのようにparentモデル側に定義されるコラム名をネストパラメータとして分析します。上の例では、Userモデルにpostsコラムが定義されると想定し、Postモデルデータの取得に利用します。

Multiple Mail Drivers

Laravel 7は1つのアプリに多数の"mailers"ドライバをサポートすることも可能にしました。各mailerドライバはmail設定に独自のoptiontransportを持つことや、特定のメールサービスで特定のメッセージを送信することが可能です。例えば、Postmarkにトランザクションのメールを、他の大部分のメールはAmazon SESに設定します。

デフォルトはmail設定ファイルに定義されているドライバを使用しますが、mailerメソードを使えば特定のメールドライバを指定できます。

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

Route Caching Speed Improvements

Laravel 7は新たなメソードを利用し、route:cacheコマンドでコンパイル済みのルートキャッシュのマーチングを行っています。大規模なアプリ(800ルート以上)にて"Hello World"のベンチマークは、毎秒2倍以上のリクエストスピードに改善されました。自らの対応はいりません。

CORS Support

Laravel 7自体はBarry vd. HeuvelさんのCORSパッケージのCross-Origin Resource Sharing (CORS)OPTIONSのリクエストとレスポンスをサポートします。新たなcors設定ファイルはLaravelアプリに存在するようになります。

Query Time Casts

テーブルから生のデータをセレクトするなど、クエリ実行時にキャストを使いたい時はあるでしょう。例えば、下のクエリ

use App\Post;
use App\User;

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

last_posted_atの結果は文字列になります。もしクエリ実行時はdateキャストに変換できれば便利ですね。そのため、Laravel 7にwithCastsが誕生しました。

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

MySQL 8+ Database Queue Improvements

前回のLaravelリリースにて、databasequeueはdeadlocksにより、商用には不十分だと考えられます。Laravel 7はMYSQL8+を使用し、データベースバックエンドqueueを改善します。FOR UPDATE SKIP LOCKEDclauseと他のSQL改善を使い、database稼働のqueueは大負荷の商用にも対応できます。

Artisan test Command

phpunitコマンドの追加として、test Artisan コマンドでもテスト実行できます。このコマンドにより、美しいコンソルUXや豊富なテスト情報が提供されます。更に、テストは初めての通らなかったテストに止まります。

php artisan test

Screenshot 2020-02-22 13.01.33.png

ちょいお試し!

vi tests/Unit/ExampleTest.php

Screenshot 2020-02-22 13.03.28.png

確かにphpunitよりわかりやすくなってるけど😳😳
大量なテストがあれば、どうなるだろうかな🤔🤔

元々phpunitに渡せるパラメータはArtisantestコマンドにも渡せます。

php artisan test --group=feature

Markdown Mail Template Improvements

デフォルトのMarkdownメールテンプレートは、Tailwind CSS カラーパレットをベースにし、更にモダンなデザインにします。もちろん、このテンプレートは自由にカスタマイズするは可能です。

Screen_Shot_2020-02-19_at_2.04.11_PM.png

Stub Customization

Artisan makeコマンドはcontrollers, jobs, migrations, testsなど様々なクラスを生成することに使われます。これらのクラスは'stub'ファイルを使用し、インプットの値を参照し、作られます。ただし、これらのクラスの構造を少し編集してmakeコマンドを使いたい事があるでしょう。Laravel 7はstub:publishを使用したら、よく使われるstubをカスタマイズすることも可能です。

php artisan stub:publish

publishedstubsフォルダはLaravelのルーツフォルダに、これらのファイルの全ての編集はmakeコマンドに反映されます。

Screenshot 2020-02-22 13.27.56.png


便利そうな機能いっぱい🙈

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした