Eloquent 5.7: создание-событие - PullRequest
0 голосов
/ 28 ноября 2018

Я хотел бы автоматизировать распределение данных для свойства (т. Е. Настроенного идентификационного номера), как только будет создан новый элемент.

Я понял, что приведенный в следующем окне пример, к сожалению,невозможно больше с Eloquent 5.7!

Невозможно в Eloquent 5.7:

use Illuminate\Database\Eloquent\Model as Eloquent;

class Message extends Eloquent {
    ...
    public static function boot() {
        parent::boot();

        self::creating(function ($model) {
            $model->ID = 1234; // 1234 shall be replaced later by a function
        });
    }
    ...
}

Для Eloquent 5.7:

Насколько я понял, теперь я должен определить отдельный класс и связать его в моей модели с запрошенным событием, например так:

use Illuminate\Database\Eloquent\Model as Eloquent;

class Message extends Eloquent {
    ...
    protected $dispatchesEvents = [
        'creating' => MessageCreated::class,
    ];
    ...
}

Но моя проблема в том, что я не знаю, как ясоздайте этот дополнительный класс "MessageCreated".Весь учебник, который я прочитал и увидел, использует полный набор Laravel (выполнение некоторых терминальных команд с ARTISAN ...).Но в моем окружении у меня установлен только Illuminate / Eloquent, поэтому я не знаю, как поступить.

Спасибо за идеи!

Тим

1 Ответ

0 голосов
/ 28 ноября 2018

Illuminate\Database\Eloquent\Model::creating (доступно через черту Illuminate\Database\Eloquent\Concerns\HasEvents ) для регистрации события создания модели с диспетчером все еще поддерживается в версии 5.7 платформы Laravel.

Этот другой способ установки класса событий в карте событий для модели позволяет отправлять пользовательское событие для события создания модели.

Класс событий MessageCreated - это просто класс PHP, конструктор которогов этом случае передал экземпляр модели Eloquent.

Это означает, что если вы решите сохранить его, то оставьте на ваше усмотрение.

Например, допустим, что MessageCreated.php добавлено в app/Events папка в App\Events пространстве имен;их содержимое будет

<?php
// app/Events/MessageCreated.php

namespace App\Events;

use App\Message;

final class MessageCreated
{
    public function __construct(Message $message) {
        $this->message = $message;
    }

}

В этой ситуации идентификатор сообщения может быть добавлен в конструктор события MessageCreated;Я не могу успокоиться с этим, потому что событие не должно изменять его полезную нагрузку.

С помощью EventServiceProvider можно зарегистрировать слушателя для обработки этого типа события.

Слушатель можетбыть созданным в папке app/Listeners. например

<?php
// app/Listeners/AddMessageId.php

namespace App\Listeners;

class AddMessageId
{
    public function handle($event)
    {
        $event->message->ID = 1234;
    }
}

В app/providers/EventServiceProvider.php зарегистрируйте прослушиватель событий в свойстве listen.

protected $listen = [
    'App\Events\MessageCreated' => [
        'App\Listeners\AddMessageId',
    ],
];

Существует встроенный инструмент, который можно использовать длясоздавать классы событий.Созданные таким образом классы находятся в пространстве имен в App\Events.

. Выполнение следующей команды запускает класс MessageCreated;вам нужно только заполнить реализацию.

php artisan make:event MessageCreated

php artisan make:listener AddMessageId
...