uiuifree.com

- サイト制作のノウハウと最適化を目指して-

2020.9.9Laravel8がリリースされました!新機能の翻訳

Laravel8がリリースされました!新機能の翻訳

2020年9月8日に Laravel8がリリースされました。 Laravel5.8を業務で使い続けてる身としてはアップデートを迫られている気分です。 尚本記事はLaravel公式のリリースノートを翻訳したものになります。

Laravel8はLaravel Jetstream モデルファクトリクラス マイグレーションスカッシング ジョブバッチ処理 改善されたレート制限 キューの改善 動的ブレードコンポーネント Tailwindページネーションビュー 時間テストヘルパーへの改善やイベントリスナーを導入することによりLaravel7で行われた改善も継続しています。

Laravel Jetstream

Laravel JetstreamはTaylor Otwellによって開発されたLaravel用の美しく設計されたアプリケーションの土台になります。

Jetstreamは、次のプロジェクトの完璧な出発点を提供し、ログイン、登録、電子メール検証、2要素認証、セッション管理、Laravel SanctumによるAPIサポート、およびオプションのチーム管理を含みます。Laravel Jetstreamは、以前のバージョンのLaravelで利用可能なレガシー認証UIスキャフォールディングを置き換え、改善します。

Modelディレクトリ

コミュニティの需要を圧倒することにより、デフォルトのLaravelアプリケーションにapp/Modelsディレクトリが含まれるようになりました。関連するすべてのジェネレーターコマンドが更新され、モデルが存在する場合はディレクトリ内にモデルが存在することを前提としています。ディレクトリが存在しない場合、フレームワークはモデルがディレクトリ内に配置されていると想定されています。

Model Factory Classes

モデルファクトリーは、クラスベースのファクトリーとして完全に書き直され、ファーストクラスの関係をサポートするように改善されました。たとえば、UserFactoryLaravel に同梱されているものは次のように書かれています。

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }
}

HasFactory生成されたモデルで利用可能な新しい特性のおかげで、モデルファクトリは次のように使用できます。

use App\Models\User;

User::factory()->count(50)->create();

ジョブのバッチ処理

Laravelのジョブバッチ処理機能を使用すると、ジョブのバッチを簡単に実行し、ジョブのバッチの実行が完了したときに何らかのアクションを実行できます。

新しいBus::batchメソッドを使用して、ジョブのバッチをディスパッチできます。もちろん、バッチ処理は主に、完了コールバックと組み合わせると便利です。だから、あなたが使用することthen、catchおよびfinallyバッチの完了コールバックを定義するための方法を。これらの各コールバックは、呼び出されたときにインスタンスを受け取ります。

sample
use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Batch;
use Throwable;

$batch = Bus::batch([
    new ProcessPodcast(Podcast::find(1)),
    new ProcessPodcast(Podcast::find(2)),
    new ProcessPodcast(Podcast::find(3)),
    new ProcessPodcast(Podcast::find(4)),
    new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {
    // All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
    // First batch job failure detected...
})->finally(function (Batch $batch) {
    // The batch has finished executing...
})->dispatch();

return $batch->id;

レート制限の改善

Laravelのリクエストレートリミッター機能は、以前のリリースのthrottleミドルウェアAPI との下位互換性を維持しながら、柔軟性とパワーが強化されています。

レートリミッターは、RateLimiterファサードのforメソッドを使用して定義されます。このforメソッドは、レートリミッター名と、このレートリミッターが割り当てられているルートに適用される制限設定を返すクロージャーを受け入れます。

sample
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

レートリミッターコールバックは着信HTTPリクエストインスタンスを受信するため、着信リクエストまたは認証済みユーザーに基づいて適切なレート制限を動的に構築できます。

sample
RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

レート制限を任意の値で分割したい場合があります。たとえば、ユーザーが特定のルートにIPアドレスごとに1分あたり100回アクセスすることを許可したい場合があります。これを行うには、byレート制限を構築するときにメソッドを使用します。

sample
RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100)->by($request->ip());
});

改善されたメンテナンスモード

Laravelの以前のリリースではphp artisan down、アプリケーションへのアクセスを許可されたIPアドレスの「許可リスト」を使用して、メンテナンスモード機能をバイパスできました。この機能は、より単純な秘密/トークンソリューションのために削除されました。

メンテナンスモードでは、secretオプションを使用してメンテナンスモードのバイパストークンを指定できます。

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

アプリケーションをメンテナンスモードにした後、このトークンに一致するアプリケーションURLに移動すると、LaravelがブラウザにメンテナンスモードのバイパスCookieを発行します。

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

この非表示のルートにアクセスする/と、アプリケーションのルートにリダイレクトされます。ブラウザにCookieが発行されると、メンテナンスモードではない場合と同じように、アプリケーションを通常どおり閲覧できます。

メンテナンスモードビューの事前レンダリング

php artisan downデプロイ中にコマンドを使用する場合、ユーザーがComposerの依存関係または他のインフラストラクチャコンポーネントの更新中にアプリケーションにアクセスすると、依然としてエラーが発生することがあります。これは、アプリケーションがメンテナンスモードであることを確認し、テンプレートエンジンを使用してメンテナンスモードビューを表示するために、Laravelフレームワークの重要な部分を起動する必要があるために発生します。

このため、Laravelでは、リクエストサイクルの最初に返されるメンテナンスモードビューを事前レンダリングできるようになりました。このビューは、アプリケーションの依存関係が読み込まれる前にレンダリングされます。downコマンドのrenderオプションを使用して、選択したテンプレートを事前レンダリングできます。

php artisan down --render="errors::503"

Closure Dispatch / Chain

新しいcatchメソッドを使用して、キューに構成されたすべての再試行を使い果たした後、キューに入れられたクロージャーが正常に完了しなかった場合に実行する必要があるクロージャーを提供できます。


use Throwable;

dispatch(function () use ($podcast) {
    $podcast->publish();
})->catch(function (Throwable $e) {
    // This job has failed...
});

動的ブレードコンポーネント

コンポーネントをレンダリングする必要があるが、実行時までどのコンポーネントをレンダリングする必要があるかわからない場合があります。この状況では、Laravelの組み込みコンポーネントdynamic-componentを使用して、ランタイム値または変数に基づいてコンポーネントをレンダリングできます。

<x-dynamic-component :component="$componentName" class="mt-4" />

ブレードコンポーネントの詳細については、ブレードのドキュメントをご覧ください。

イベントリスナーの改善

ClosureをEvent::listen メソッドに渡すだけで、Closureベースのイベントリスナーを登録できるようになりました。Laravelはクロージャーを検査して、リスナーハンドラーがイベントのタイプを決定します。

use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;

Event::listen(function (PodcastProcessed $event) {
    //
});

さらに、クロージャベースのイベントリスナーは、次の関数を使用してキュー可能としてマークすることができます

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;

Event::listen(queueable(function (PodcastProcessed $event) {
    //
}));

キューに入れられたジョブと同様にonConnectionおよびonQueuedelayメソッドを使用して、キューに入れられたリスナーの実行をカスタマイズできます。

Event::listen(queueable(function (PodcastProcessed $event) {
    //
})->onConnection('redis')->onQueue('podcasts')->delay(now()->addSeconds(10)));

時間テストヘルパー

テスト時に、nowまたはなどのヘルパーによって返される時間を変更する必要がある場合があります。Laravelのベース機能テストクラスには、現在の時刻を操作できるヘルパーが含まれています。

public function testTimeCanBeManipulated()
{
    // Travel into the future...
    $this->travel(5)->milliseconds();
    $this->travel(5)->seconds();
    $this->travel(5)->minutes();
    $this->travel(5)->hours();
    $this->travel(5)->days();
    $this->travel(5)->weeks();
    $this->travel(5)->years();

    // Travel into the past...
    $this->travel(-5)->hours();

    // Travel to an explicit time...
    $this->travelTo(now()->subHours(6));

    // Return back to the present time...
    $this->travelBack();
}

artisan serveの改良

artisan serve コマンドが改善されました。以前.envファイルの環境変数が変更された場合はコマンドを手動で停止して再起動する必要がありましたが自動再読み込みされるようになりました。

Tailwindのページ分割ビュー

Laravelページネーターは、デフォルトでTailwind CSSフレームワークを使用するように更新されました。Tailwind CSSは高度にカスタマイズ可能な低レベルのCSSフレームワークで、特注のデザインを構築するために必要なすべてのビルディングブロックを提供します。もちろん、Bootstrap 3および4のビューも引き続き使用できます。

ネームスペースの更新のルーティング

Laravelの以前のリリースでは、RouteServiceProviderには$namespaceプロパティが含まれていました。このプロパティの値は、コントローラールート定義とactionヘルパー/URL::actionの呼び出しに自動的にプレフィックスされます。Laravel 8.xでは、このプロパティはデフォルトです。これは、Laravelによる自動名前空間接頭辞付けが行われないことを意味します。したがって、新しいLaravel 8.xアプリケーションでは、標準のPHP呼び出し可能構文を使用してコントローラールート定義を定義する必要があります。

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

action関連の方法は、同じ呼び出し可能な構文を使用する必要があります。


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

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

Laravel 7.xスタイルのコントローラールートプレフィックスを使用する場合は$namespace、アプリケーションのRouteServiceProviderにプロパティを追加するだけです

PROFILE

このサイトを運営してるuiuifreeです。
渋谷のベンチャー企業で2年ほど新規事業を担当した後にフリーランスエンジニアにキャリア転換。
求人サイトの開発が多くエンジニア/看護師/保育士などの分野でサイトを運営しています。

アウトプット中の技術

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)