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)
遇到这个问题并找到了另一种可能对其他人有帮助的方法。
目前,还可以选择利用观察者,而不必创建自定义事件类。
在您的模型中添加以下属性:
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)
或者在模型之外(因为fireModelEvent是protected):
event('eloquent.confirmed: ' . Payment::class, $payment);
Run Code Online (Sandbox Code Playgroud)
我可以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()
它还建议如果调用了确认()方法两次,则抛出异常。
| 归档时间: |
|
| 查看次数: |
4158 次 |
| 最近记录: |