Добавление события afterFind в Laravel

После перехода с yii на laravel одним из самых странных моментов для меня было отсутствие в laravel5 события afterfind. Это событие невероятно полезно в моделях yii. Конечно, за счет другой работы с полями моделей необходимость в методе чувствуется не так сильно, но все равно бывают моменты, когда становится очень жаль, что это событие не реализовано.

Пострадав некоторое время, я решил написать его сам. Ключевым вопросом в этом является "Куда нужно поставить генератор события?". Все объекты, которые получаются из БД генерируются через метод: newFromBuilder. Добавив в него инициатор события мы получим:

    /**
     * Create a new model instance that is existing.
     *
     * @param  array  $attributes
     * @param  string|null  $connection
     * @return static
     */
    public function newFromBuilder($attributes = [], $connection = null)
    {
        $model = parent::newFromBuilder($attributes, $connection);

        $model->fireModelEvent('found', false);

        return $model;
    }

Для того чтобы framework знал какие события есть, добавим событие в список доступных:

    /**
     * Get the observable event names.
     *
     * @return array
     */
    public function getObservableEvents()
    {
        return array_merge(
            parent::getObservableEvents(),
            [
                'found'
            ]
        );
    }

Кроме этого напишем обертку-инициализатор над будущим обработчиком события:

   /**
     * Register a saved model event with the dispatcher.
     *
     * @param  \Closure|string  $callback
     * @param  int  $priority
     * @return void
     */
    public static function found($callback, $priority = 0)
    {
        static::registerModelEvent('found', $callback, $priority);
    }

Для удобства я сгрупировал все эти функции в небольшой плагин-trait.

Теперь, подмешав в мою модель trait, я начал получать уведомления про объекты полученные из базы данных:

use Eloquent\LaraFindEvents\LaraFindEvents as LaraFindEvents;

class WildPlant extends Model
{
    use LaraFindEvents;

    protected $table = 'fruits';

    public static function boot()
    {
        parent::boot();

        static::found(function (WildPlant $wildPlant) {
            var_dump('Iamfound', $wildPlant->id);
            return true;
        });
    }
}

Вот так легко и просто можно добавить любые нестандартные события в вашу модель

Posted in Laravel, PHP, Yii on Sep 17, 2015

comments powered by Disqus