如何将自定义事件添加到 Laravel 模型

How to add custom event to a Laravel model

我有付款模式,想在确认付款后触发自定义事件。

我的型号代码:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Payment extends Model
{
    protected $dates = [
        'created_at', 'updated_at', 'confirmed_at',
    ];

    public function confirmed(){
        $this->setAttribute('confirmed_at', now());
        $this->setAttribute('status', 'confirmed');
    }
}

我可以在 Payment->confirmed() 方法中触发一个 confirmed 事件,如下所示:

    public function confirmed(){
        // todo, throw an exception if already confirmed

        $this->setAttribute('confirmed_at', now());
        $this->setAttribute('status', 'confirmed');

        // fire custom event
        $this->fireModelEvent('confirmed');
    }

并将自定义事件注册到 $dispatchesEvents

 protected $dispatchesEvents = [
        'confirmed' =>  \App\Events\Payment\ConfirmedEvent::class
 ];

完成。 \App\Events\Payment\ConfirmedEvent::class 事件将在模型 confirmed() 方法被调用时调用。

还建议在 confirmed() 方法调用两次时抛出异常。

你可以使用 Attribute Events:

protected $dispatchesEvents = [
    'status:confirmed' => PaymentConfirmed::class,
];

遇到这个问题并找到了另一种可能对其他人有帮助的方法。

目前还有一个选项可以利用观察者,而不必创建自定义事件 类。

在您的模型中添加以下内容 属性:

protected $observables = ['confirmed'];

此 属性 是 HasEvents 特征的一部分,并将此事件注册为 eloquent 事件 (eloquent.confirmed: \App\Payment)。

您现在可以向观察者添加方法:

public function confirmed(Payment $payment);

您现在可以触发事件并调用观察者方法:

$this->fireModelEvent('confirmed');

或在模型之外(因为 fireModelEventprotected):

event('eloquent.confirmed: ' . Payment::class, $payment);