Как реализовать красноречивое событие «сохранения» для всех моделей, а не по отдельности

Основываясь на документации события laravel eloquent, все события eloquent запускаются индивидуально на основе каждого модель, есть ли способ использовать событие «создание» или любое другое красноречивое событие, которое будет запускаться всеми моделями

Например, если создаются какие-либо модели, запускается событие A.


person Bathulah Mahir    schedule 06.12.2017    source источник
comment
Расширение модели как базового класса или использование трейтов   -  person online Thomas    schedule 06.12.2017
comment
Томас Мурс, можешь показать пример?   -  person Bathulah Mahir    schedule 06.12.2017
comment
Вы имеете в виду репозиторий?   -  person Adam Kozlowski    schedule 06.12.2017
comment
@AdamKozlowski нет, я действительно имею в виду, как использовать событие laravel eloquent глобально для всей модели, прямо сейчас в документации просто показано, как использовать его по отдельности   -  person Bathulah Mahir    schedule 06.12.2017


Ответы (2)


Прослушайте событие Eloquent creating, которое запускается. Это "строковое" событие, которое все еще не является объектом, поэтому вы можете сделать некоторые... сопоставления с подстановочными знаками здесь.

Это строка событий, которые запускаются из Eloquent:

"eloquent.{$event}: ".static::class

Таким образом, вы можете прослушивать "eloquent.creating: *", чтобы поймать все эти строковые события для создания Eloquent для любой модели.

Event::listen('eloquent.creating: *', function ($event, $model) {
    ....
});

Очевидно, что если вы определили свою модель для использования пользовательских объектов событий, она не сможет их поймать.

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

person lagbox    schedule 06.12.2017
comment
поставщик услуг сделал бы - person lagbox; 06.12.2017
comment
как насчет того, чтобы сделать исключение для определенной модели? - person Bathulah Mahir; 07.12.2017

Расширьте класс модели:

use Auth;
use Illuminate\Database\Eloquent\Model;

class GeneralModel extends Model
{
  public static function boot()
  {
    parent::boot();

    static::creating(function ($model) {
        if (Auth::user()) {
            $model->created_by = Auth::user()->id;
            $model->updated_by = Auth::user()->id;
        }
    });
  }
}

Когда вы скажете создать скажем объект property, он сработает. Используйте его для всех моделей, которые вам нужны.

class Property extends GeneralModel
{
  //..
}
person SteD    schedule 06.12.2017