从扩展类调度事件

时间:2018-06-05 15:37:14

标签: php laravel events

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

但事件似乎没有被解雇。我做错了吗?

1 个答案:

答案 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