php - 从扩展类调度事件
问题描述
在 Laravel 5.5 项目中,我有一个 Person 类和一个 Student 类。Student 类扩展了 Person 类。我有一堆事情需要在创建一个新人时发生,还有一堆事情需要在创建一个新学生(当然也是一个人)时发生。
我的课看起来像这样......
class Person extends Model {
protected $dispatchesEvents = [
'created' => PersonJoins::class
];}
.
class Student extends Person {
protected $dispatchesEvents = [
'created' => StudentIsCreated::class,
];}
创建新的 Student 实例时,会触发 StudentIsCreated 事件,但不会触发 PersonJoins 事件。
一种解决方法是将其中一个模型中的“已创建”更改为“已保存”,然后触发两个事件。由此看来,正在发生的事情似乎很明显。Person 模型上 $dispatchesEvents 数组中的“created”元素被 Student 模型上的相同元素覆盖。即使只是打字,似乎解决方案应该是显而易见的,但我就是看不到它。
所以,我的问题是......我如何在两个模型上触发一个由“创建”触发的事件,其中一个扩展另一个?
谢谢你。大卫。
编辑: 阅读@hdifen 答案后。我的学生模型现在看起来像这样......
class Student extends Person
{
protected static function boot()
{
parent::boot();
static::created(function($student) {
\Event::Fire('StudentCreated', $student);
});
}
}
在App\Events\StudentCreated.php
我有...
class StudentCreated
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($student)
{
echo ("\r\nStudentCreated event has fired");
$this->student = $student;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('Student-Is-Created-Channel');
}
}
但该事件似乎没有被解雇。难道我做错了什么?
解决方案
是的,您是正确的,学生模型正在覆盖父变量 $dispatchesEvents。
$dispatchedEvent
如果您正在做一些更复杂的事情,需要代码的其他部分在它们被触发时做出反应,我建议不要使用事件。
简单的解决方案是手动挂钩到模型中的 created 事件,在您的情况下,您想在创建学生时创建成绩模型?
protected static function boot()
{
parent::boot();
static::created(function($model) {
$grade = new Grade;
$model->grades->save($grade);
// Or if you really want to use an event something like
Event::fire('student.created', $student);
});
}
这篇文章可能会给你一个想法: