John Main Logo

John Main

Code. Design. Hosting. Maintenance.

05
Feb '18

Model Loaded and Before-Update Events in Laravel

So we all know about Laravel’s built-in ‘creating’, ‘created’, ‘updating’, ‘updated’ etc model events. Seriously useful events for all manner of purposes.

Recently I found myself needing to add a couple more; one to trigger when a model was loaded (for logging purposes), and one before a model was updated (so that I could archive a copy of it before the data was changed).

I came up with the following code and inserted it into an abstract base model class, which all the other models extend.

protected $observables = ['loaded', 'beforeUpdate'];
/**
* Register a loaded model event with the dispatcher.
*
* @param  \Closure|string  $callback
* @return void
*/
public static function loaded($callback)
{
static::registerModelEvent('loaded', $callback);
}
/**
* Register a before update model event with the dispatcher.
*
* @param  \Closure|string  $callback
* @return void
*/
public static function beforeUpdate($callback)
{
static::registerModelEvent('beforeUpdate', $callback);
}
/**
* Create a new model instance.
*
* @param  array  $attributes
* @return \Illuminate\Database\Eloquent\Model|static
*/
public function newFromBuilder($attributes = array(), $connection = null)
{
$instance = parent::newFromBuilder($attributes);
$instance->fireModelEvent('loaded', false);
return $instance;
}
/**
* Trigger before update
*
* @param  array  $attributes
* @return \Illuminate\Database\Eloquent\Model|static
*/
public function update(array $attributes = [], array $options = [])
{
$this->fireModelEvent('beforeUpdate', false);
return parent::update($attributes);
}

Leave a Reply