首页 > 解决方案 > 从扩展类调度事件

问题描述

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

但该事件似乎没有被解雇。难道我做错了什么?

标签: phplaravelevents

解决方案


是的,您是正确的,学生模型正在覆盖父变量 $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);
    });
}

这篇文章可能会给你一个想法:

Laravel 模型事件 - 我对它们的去向有点困惑


推荐阅读