После перехода с 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;
});
}
}
Вот так легко и просто можно добавить любые нестандартные события в вашу модель