2020年9月8日に Laravel8がリリースされました。 Laravel5.8を業務で使い続けてる身としてはアップデートを迫られている気分です。 尚本記事はLaravel公式のリリースノートを翻訳したものになります。
Laravel8はLaravel Jetstream
モデルファクトリクラス
マイグレーションスカッシング
ジョブバッチ処理
改善されたレート制限
キューの改善
動的ブレードコンポーネント
Tailwindページネーションビュー
時間テストヘルパー
への改善やイベントリスナーを導入することによりLaravel7で行われた改善も継続しています。
Laravel JetstreamはTaylor Otwellによって開発されたLaravel用の美しく設計されたアプリケーションの土台になります。
Jetstreamは、次のプロジェクトの完璧な出発点を提供し、ログイン、登録、電子メール検証、2要素認証、セッション管理、Laravel SanctumによるAPIサポート、およびオプションのチーム管理を含みます。Laravel Jetstreamは、以前のバージョンのLaravelで利用可能なレガシー認証UIスキャフォールディングを置き換え、改善します。
コミュニティの需要を圧倒することにより、デフォルトのLaravelアプリケーションにapp/Models
ディレクトリが含まれるようになりました。関連するすべてのジェネレーターコマンドが更新され、モデルが存在する場合はディレクトリ内にモデルが存在することを前提としています。ディレクトリが存在しない場合、フレームワークはモデルがディレクトリ内に配置されていると想定されています。
モデルファクトリーは、クラスベースのファクトリーとして完全に書き直され、ファーストクラスの関係をサポートするように改善されました。たとえば、UserFactory
Laravel に同梱されているものは次のように書かれています。
<?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バッチの完了コールバックを定義するための方法を。これらの各コールバックは、呼び出されたときにインスタンスを受け取ります。
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
メソッドは、レートリミッター名と、このレートリミッターが割り当てられているルートに適用される制限設定を返すクロージャーを受け入れます。
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(1000);
});
レートリミッターコールバックは着信HTTPリクエストインスタンスを受信するため、着信リクエストまたは認証済みユーザーに基づいて適切なレート制限を動的に構築できます。
RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(100);
});
レート制限を任意の値で分割したい場合があります。たとえば、ユーザーが特定のルートにIPアドレスごとに1分あたり100回アクセスすることを許可したい場合があります。これを行うには、by
レート制限を構築するときにメソッドを使用します。
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"
新しい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 コマンドが改善されました。以前.env
ファイルの環境変数が変更された場合はコマンドを手動で停止して再起動する必要がありましたが自動再読み込みされるようになりました。
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
にプロパティを追加するだけです