Отправка событий из расширенного класса - PullRequest
0 голосов
/ 05 июня 2018

В проекте 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 - нет.

Обходной путь - изменить «созданный» в одной из моделей на «сохраненный», после чего оба события будут запущены.Из этого кажется очевидным, что происходит.Элемент 'create' в массиве $ dispatchesEvents в модели Person перезаписывается тем же самым в модели 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');
    }
}

Но событие не 'похоже, уволен.Я что-то не так делаю?

1 Ответ

0 голосов
/ 05 июня 2018

Да, вы правы, модель студента перезаписывает родительскую переменную $ 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 - я немного запутался в том, куда они должны идти .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...