Laravel - イベント処理

こんにちは、将来のLaravel魔法使いさんたち!今日は、Laravelのイベント処理の魔法の世界に飛び込みます。プログラミングが初めてでも心配しないでください。私はこの旅をステップバイステップで案内します。これまでに数多くの生徒を指導してきた経験を活かしてです。お気に入りの飲み物を一杯取り、このエキサイティングな冒険に一緒に飛び込みましょう!

Laravel - Event Handling

Laravelでのイベントとは?

パーティ(もちろんコードパーティです!)で重要なことが起こる時、例えばケーキが到着した時、皆が興奮します。Laravelでは、イベントはアプリケーションにとって興味深い特別な出来事です。

例えば、ユーザーがウェブサイトに登録する時はイベントです。注文が placed される時も別のイベントです。イベントはコードを整理整頓し、アプリケーションの異なる部分がこれらの重要な瞬間に反応できるようにします。

なぜイベントを使うのか?

  1. デカプリング: イベントはアプリケーションの異なる部分を分離します。仕事の異なるチームがあるように、それぞれのチームは他のチームのすべてを知る必要はありません。

  2. 柔軟性: 既存のコードを変更することなく、イベントに新しい反応を簡単に追加できます。

  3. 明瞭性: イベントはコードを理解しやすくします。何が起こっていて、いつ起こるかが明確です。

最初のイベントを作成する

一緒に最初のイベントを作成しましょう。新しいユーザーが登録した時のイベントを作成します。以下のようにします:

php artisan make:event NewUserRegistered

このコマンドは app/Events 配下に NewUserRegistered.php という新しいファイルを作成します。中身を見てみましょう:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class NewUserRegistered
{
use Dispatchable, InteractsWithSockets, SerializesModels;

public $user;

public function __construct($user)
{
$this->user = $user;
}

public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}

このコードに驚かないでください!レシピのように、それぞれの材料を見ていきましょう:

  • 顶部の use 文は必要なツールをインポートしています。
  • 我々のイベントクラス NewUserRegistered は魔法が起こる場所です。
  • $user プロパティは新しいユーザーの情報を保持します。
  • __construct メソッドはイベントを作成する際に呼ばれ、ユーザー情報を保存します。

イベントを発火(ディスパッチ)する

イベントを作成したので、使ってみましょう!新しいユーザーが登録した際にこのイベントを発火します。以下のようにコントローラーで行います:

use App\Events\NewUserRegistered;

public function register(Request $request)
{
// ... ユーザー登録ロジック ...

$user = User::create($request->all());

event(new NewUserRegistered($user));

return redirect('/welcome');
}

ここでは、新しいユーザーを作成した後、event() 関数を使ってイベントを発火しています。まるで新しいユーザーを祝う花火を打ち上げるようなものです!

イベントをリスンする

次に、イベントに反応するリスナーを作成しましょう。パーティでケーキが到着した際にパーティハットを配る人を思い浮かべてください。

まず、リスナーを作成します:

php artisan make:listener SendWelcomeEmail --event=NewUserRegistered

これにより app/Listeners 配下に SendWelcomeEmail.php という新しいファイルが作成されます。中身を見てみましょう:

<?php

namespace App\Listeners;

use App\Events\NewUserRegistered;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

class SendWelcomeEmail
{
public function handle(NewUserRegistered $event)
{
// $event->user を使用してユーザーにアクセス
// ウェルカムメール送信ロジックここに
}
}

handle メソッドはイベントが発生した際に実行されるコードを記述します。この場合、ウェルカムメールを送信するロジックを記述します。

イベントリスナーを登録する

イベントとリスナーを結びつけるために、登録する必要があります。app/Providers/EventServiceProvider.php を開き、以下を $listen 配列に追加します:

protected $listen = [
NewUserRegistered::class => [
SendWelcomeEmail::class,
],
];

これでLaravelに「NewUserRegistered が発生したら SendWelcomeEmail を実行して」と伝えることができます!

イベントサブスクライバ

時々、クラスが複数のイベントを処理したい場合があります。その場合、イベントサブスクライバが役立ちます。パーティの計画を担当する人のようなものです。

以下のようにイベントサブスクライバを作成します:

php artisan make:listener UserEventSubscriber

そして UserEventSubscriber クラス内:

<?php

namespace App\Listeners;

class UserEventSubscriber
{
public function handleUserRegistered($event) {}

public function handleUserLoggedIn($event) {}

public function subscribe($events)
{
$events->listen(
'App\Events\NewUserRegistered',
'App\Listeners\UserEventSubscriber@handleUserRegistered'
);

$events->listen(
'App\Events\UserLoggedIn',
'App\Listeners\UserEventSubscriber@handleUserLoggedIn'
);
}
}

このサブスクライバを登録するために、EventServiceProvider$subscribe プロパティに追加します:

protected $subscribe = [
'App\Listeners\UserEventSubscriber',
];

キュー化されたイベントリスナー

イベントリスナーが時間がかかる処理(例えばメールを送信する)をしている場合、アプリケーションの速度を遅くしないためにキューにします。後で暇なときに処理させるようなものです。

リスナーをキュー化するには、ShouldQueue インターフェースを実装します:

use Illuminate\Contracts\Queue\ShouldQueue;

class SendWelcomeEmail implements ShouldQueue
{
// ...
}

これで、Laravelは自動的にこのリスナーをキューにします!

イベントメソッド表

以下はイベントで使用する主要なメソッドの一覧です:

メソッド 説明
event() イベントをディスパッチする
listen() イベントリスナーを登録する
subscribe() イベントサブスクライバを登録する
dispatch() イベントをディスパッチする別の方法
broadcast() リアルタイムアプリケーション向けにイベントをブロードキャストする

そして、ここまでで私たちが一緒にLaravelのイベント処理の旅を終えました。実践が完璧を生むことを忘れずに、これらの概念を自分のプロジェクトで試してみてください。あなたが史上最高のコードパーティを開くためのイベント処理スキルを身につけるかもしれません!

ハッピーコーディング、そしてあなたのイベントが常に優雅に処理されることを祈っています!

Credits: Image by storyset