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

Ami*_*aei 3 laravel eloquent laravel-5 laravel-events

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

我的模型代码:

<?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');
    }
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*een 8

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

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

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

protected $observables = ['confirmed'];
Run Code Online (Sandbox Code Playgroud)

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

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

public function confirmed(Payment $payment);
Run Code Online (Sandbox Code Playgroud)

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

$this->fireModelEvent('confirmed');
Run Code Online (Sandbox Code Playgroud)

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

event('eloquent.confirmed: ' . Payment::class, $payment);
Run Code Online (Sandbox Code Playgroud)


Ami*_*aei 6

我可以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');
    }
Run Code Online (Sandbox Code Playgroud)

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

 protected $dispatchesEvents = [
        'confirmed' =>  \App\Events\Payment\ConfirmedEvent::class
 ];
Run Code Online (Sandbox Code Playgroud)

完毕。当调用\App\Events\Payment\ConfirmedEvent::classModel方法时,该事件将被调用。confirmed()

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