0

Laravel の Event & Listener 機能を使用して、次のモデル アクションを検出し、いくつかのアプリケーション ロジックをトリガーしています。

アプリ/モデル/MealFood

/**
 * The event map for the model.
 *
 * Allows for object-based events for native Eloquent events.
 *
 * @var array
 */
protected $dispatchesEvents = [
    'created'  => MealFoodEvent::class,
    'updated'  => MealFoodEvent::class,
    'deleted'  => MealFoodEvent::class
];

アプリ/イベント/MealFoodEvent

public $mealFood;

/**
 * Create a new event instance.
 *
 * @param MealFood $mealFood
 */
public function __construct(MealFood $mealFood)
{
    $this->mealFood = $mealFood;
}

アプリ/リスナー/MealFoodListener

public function handle(MealFoodEvent $event)
{
    $mealFood = $event->mealFood;
}

どのモデル アクションがイベントをトリガーしたかを検出することは可能ですか? イベントをトリガーするレコードが作成/更新/削除されたかどうかを知りたいです。論理的な削除を使用してレコードが削除されたかどうかを確認していることはわかっていますが、レコードが更新または作成されたかどうかを確認するにはどうすればよいですか?

4

1 に答える 1

1

3 つの追加クラスを作成します。

MealFoodCreatedEvent.php

class MealFoodCreatedEvent extends MealFoodEvent {}

MealFoodUpdatedEvent.php

class MealFoodUpdatedEvent extends MealFoodEvent {}

MealFoodDeletedEvent.php

class MealFoodDeletedEvent extends MealFoodEvent {}

モデルを変更します。

protected $dispatchesEvents = [
    'created'  => MealFoodCreatedEvent::class,
    'updated'  => MealFoodUpdatedEvent::class,
    'deleted'  => MealFoodDeletedEvent::class
];

次に、イベントハンドラーで次のことができます。

public function handle(MealFoodEvent $event)
{
    $mealFood = $event->mealFood;
    if ($event instanceof MealFoodCreatedEvent) { 
       // the event was "created
    }
}

handleすべてのイベントが延長されるため、署名は引き続き機能しますMealFoodEvent

MealFoodEventインスタンスを直接作成する必要がないため、抽象化することもできます。

于 2022-01-15T07:20:53.177 に答える