在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模型上的相同覆盖。即使只是输入,似乎解决方案应该是显而易见的,但我只是看不到它。
所以,我的问题是这个......我如何在两个模型上创建一个由'created'触发的事件,其中一个扩展另一个模型?
谢谢。 大卫。
修改 看完@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');
}
}
但事件似乎没有被解雇。我做错了吗?
答案 0 :(得分:0)
是的,你的学生模型正在覆盖父变量$ dispatchesEvents。
我建议不要使用$dispatchedEvent
,因为如果您正在做一些更复杂的事情,要求代码的其他部分在被触发时作出反应,则主要使用事件。
简单的解决方案是手动挂钩模型中创建的事件,在您创建学生时要创建成绩模型吗?
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);
});
}
这篇文章可能会给你一个想法:
Laravel Model Events - I'm a bit confused about where they're meant to go