「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Laravel でイベント リスナーを使用する方法とタイミング 実践的なコード例

Laravel でイベント リスナーを使用する方法とタイミング 実践的なコード例

2024 年 8 月 18 日に公開
ブラウズ:250

How & When To Use Event Listeners in Laravel  Practical Code Examples

Laravel のイベント システムは、分離された完全に複雑なアプリを構築するための基礎となるため、Web アプリ内の複雑なデータを処理することに関しては驚異的です。このガイドでは、特に 2024 年におけるイベント リスニングの実装と利用に関する非常に詳細なポイントを説明し、Laravel 11 のイベント リスナーの最も広範な内容と詳細なコード サンプルによる新たな視点を提供します。

*(A) イベントとリスナーの背後にあるコアを理解する
*

それでは、詳しく見てみましょう。Laravel のイベントは、アプリ内での特定の出来事を表します。リスナーは、そのようなすべてのアプリ イベントに応答するクラスです。このパターンは懸念事項の分離を促進し続け、よりモジュール化されたテスト可能なコードを可能にします。

*(B) イベントの作成
*

まず、複雑なイベントを作成することから始めましょう。これについては Artisan コマンドを使用して説明します。これを行うことを強くお勧めします。

php 職人 make:event OrderPlaced

このコマンドは、app/Events ディレクトリに新しいイベント クラスを生成します。より詳細なイベント クラスを調べてみましょう

`名前空間 App\Events;

App\Models\Order を使用;
App\Models\User;
を使用します Illuminate\Foundation\Events\Dispatchable を使用します;
Illuminate\Queue\SerializesModels を使用します;
Illuminate\Broadcasting\InteractsWithSockets を使用します;
Illuminate\Broadcasting\PrivateChannel を使用します;
Illuminate\Contracts\Broadcasting\ShouldBroadcast を使用します;

クラス OrderPlaced は ShouldBroadcast を実装します
{
Dispatchable、InteractsWithSockets、SerializesModels を使用します;

public $order;
public $user;

/**
 * Create a new event instance.
 *
 * @param  \App\Models\Order  $order
 * @param  \App\Models\User  $user
 * @return void
 */
public function __construct(Order $order, User $user)
{
    $this->order = $order;
    $this->user = $user;
}

/**
 * Get the channels the event should broadcast on.
 *
 * @return \Illuminate\Broadcasting\Channel|array
 */
public function broadcastOn()
{
    return new PrivateChannel('orders.'.$this->user->id);
}

/**
 * The event's broadcast name.
 *
 * @return string
 */
public function broadcastAs()
{
    return 'order.placed';
}

}`

この拡張された例では、Order モデルと User モデルの両方が含まれています。 SerializesModels トレイトは、イベントがキューに入れられたリスナーに渡されるときに、Eloquent モデルが正しくシリアル化および逆シリアル化されることを保証します。また、ShouldBroadcast インターフェースを実装し、broadcastOn メソッドと broadcastAs メソッドを定義して、このイベントを WebSocket にブロードキャストしてリアルタイム更新できるようにしました。

*複数のリスナーの作成
*

1 つのイベントに対して、複数のリスナーが必要になる場合があります。例をさらに拡張するために、OrderPlaced イベントの 2 つのリスナーを作成してみましょう。皆さんには、すべての要点を確実に理解していただきたいと思います。そのため、以下のコード例を参照してください

php 職人 make:listener SendOrderconfirmation --event=OrderPlaced
php 職人 make:listener UpdateInventory --event=OrderPlaced

このコマンド ラインにより、app/Listeners ディレクトリにいくつかの新しいリスナー クラスが取得されることがわかりました。ここで重要なのは、以下で SendOrderconfirmation リスナーを調べて、それがさらにどのように進行するかを確認することです

`名前空間 App\Listeners;

App\Events\OrderPlaced を使用;
App\Mail\Orderconfirmation を使用します;
Illuminate\Contracts\Queue\ShouldQueue を使用します;
Illuminate\Queue\InteractsWithQueue を使用します;
Illuminate\Support\Facades\Mail を使用します;
Illuminate\Support\Facades\Log を使用します;

SendOrderconfirmation クラスは ShouldQueue を実装します
{
InteractsWithQueue を使用します;

/**
 * The number of times the job may be attempted.
 *
 * @var int
 */
public $tries = 3;

/**
 * Handle the event.
 *
 * @param  \App\Events\OrderPlaced  $event
 * @return void
 */
public function handle(OrderPlaced $event)
{
    $order = $event->order;
    $user = $event->user;

    try {
        Mail::to($user->email)->send(new OrderConfirmation($order));
        Log::info('Order confirmation email sent', ['order_id' => $order->id, 'user_id' => $user->id]);
    } catch (\Exception $e) {
        Log::error('Failed to send order confirmation email', ['order_id' => $order->id, 'user_id' => $user->id, 'error' => $e->getMessage()]);
        $this->fail($e);
    }
}

/**
 * Handle a job failure.
 *
 * @param  \App\Events\OrderPlaced  $event
 * @param  \Throwable  $exception
 * @return void
 */
public function failed(OrderPlaced $event, $exception)
{
    Log::error('Order confirmation listener failed', ['order_id' => $event->order->id, 'user_id' => $event->user->id, 'error' => $exception->getMessage()]);
}

}`

このリスナーは ShouldQueue インターフェイスを実装しており、キューに入れる必要があることを示しています。エラー処理とログ記録を追加し、失敗を処理する失敗したメソッドを定義しました。 $tries プロパティは、失敗した場合に複数回試行できるように設定されます。
次に、UpdateInventory リスナー

を見てみましょう。

`名前空間 App\Listeners;

App\Events\OrderPlaced を使用;
Illuminate\Contracts\Queue\ShouldQueue を使用します;
Illuminate\Queue\InteractsWithQueue を使用します;
Illuminate\Support\Facades\DB を使用します;
Illuminate\Support\Facades\Log を使用します;

UpdateInventory クラスは ShouldQueue を実装します
{
InteractsWithQueue を使用します;

/**
 * Handle the event.
 *
 * @param  \App\Events\OrderPlaced  $event
 * @return void
 */
public function handle(OrderPlaced $event)
{
    $order = $event->order;

    DB::transaction(function () use ($order) {
        foreach ($order->items as $item) {
            $product = $item->product;

            if ($product->stock quantity) {
                throw new \Exception("Insufficient stock for product: {$product->id}");
            }

            $product->decrement('stock', $item->quantity);
            Log::info("Inventory updated", ['product_id' => $product->id, 'quantity' => $item->quantity]);
        }
    });
}

/**
 * Handle a job failure.
 *
 * @param  \App\Events\OrderPlaced  $event
 * @param  \Throwable  $exception
 * @return void
 */
public function failed(OrderPlaced $event, $exception)
{
    Log::error('Failed to update inventory', ['order_id' => $event->order->id, 'error' => $exception->getMessage()]);
}

}`

このリスナーは、注文品目に基づいて在庫をアップグレードするなどの理由で存在していることがおわかりいただけると思います。データの一貫性を確保するために、在庫の更新をデータベース トランザクションでラップしました。また、マイナス在庫を防ぐためにエラー チェックを追加し、更新の成功と失敗のログを組み込みました。

*イベントとリスナーの登録
*

これらのイベントとリスナーを EventServiceProvider

に登録します。

`App\Events\OrderPlaced を使用します;
App\Listeners\SendOrderconfirmation を使用します;
App\Listeners\UpdateInventory を使用します;

クラス EventServiceProvider は ServiceProvider を拡張します
{
/**
* アプリケーションのイベント リスナー マッピング。
*
* @var 配列
*/
保護された $listen = [
OrderPlaced::class => [
SendOrderconfirmation::class,
UpdateInventory::class,
]、
];

/**
 * Register any events for your application.
 *
 * @return void
 */
public function boot()
{
    parent::boot();

    //
}

}`

イベントのディスパッチ:

コントローラーまたはサービス クラスからイベントをディスパッチできます

`App\Events\OrderPlaced を使用します;
App\Models\Order を使用;
Illuminate\Http\Request を使用します;
Illuminate\Support\Facades\DB を使用します;

クラス OrderController はコントローラを拡張します
{
/**
* 新規注文します。
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
パブリック関数 placeOrder(Request $request)
{
$user = auth()->user();

    DB::transaction(function () use ($request, $user) {
        $order = Order::create($request->all());
        $order->user()->associate($user);
        $order->save();

        event(new OrderPlaced($order, $user));
    });

    return response()->json(['message' => 'Order placed successfully', 'order_id' => $order->id]);
}

}`

この例では、注文の作成とイベントのディスパッチをデータベース トランザクションにラップして、両方が正常に実行されるかまったく実行されないかを確認します。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/danish/how-when-to-use-event-listeners-in-laravel-11-practical-code-examples-29mn?1 侵害がある場合は、 Study_golang@163 .comdelete に連絡してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3