3

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

我的型号代码:

<?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');
    }
}
4

3 回答 3

4

我可以在方法中触发一个confirmed事件Payment->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()方法时将调用该事件。

如果被确认()方法被调用两次,它还建议抛出异常。

于 2019-10-13T12:02:40.897 回答
2

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

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

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

protected $observables = ['confirmed'];

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

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

public function confirmed(Payment $payment);

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

$this->fireModelEvent('confirmed');

或模型之外(因为fireModelEventis protected):

event('eloquent.confirmed: ' . Payment::class, $payment);
于 2021-06-08T09:49:16.290 回答
2

您可以使用属性事件

protected $dispatchesEvents = [
    'status:confirmed' => PaymentConfirmed::class,
];
于 2021-04-08T12:44:02.657 回答