Here’s a clean way to distinguish between soft & hard deletion events on your soft deletable Eloquent model. Include this trait into your Observer.
ClassifiesDeleted.php
<?php namespace App\Observers; use Illuminate\Database\Eloquent\Model; trait ClassifiesDeleted { /** * Hook into post-delete operations. * * @param Model $model */ public function deleted(Model $model) { $method = $this->isSoftDeleted($model) ? 'softDeleted' : 'hardDeleted'; // Call the appropriate method, if it exists. if (method_exists($this, $method)) { return $this->$method($model); } } /** * Determine if the model was soft deleted. * * @param Model $model * * @return bool */ private function isSoftDeleted(Model $model) { return $model->isDirty($model->getDeletedAtColumn()); } }
This trait will inject two methods into your observer: softDeleted()
and hardDeleted()
. Here’s how that would look like in your observer.
UserObserver.php
<?php namespace App\Observers; use App\User; class UserObserver { /** * Hook into soft-deleted operations. * * @param User $user */ protected function softDeleted(User $user) { // } /** * Hook into hard-deleted operations. * * @param User $user */ protected function hardDeleted(User $user) { // } }
Of course, in order for classification of the delete event to occur, your model must be soft deletable.
User.php
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use App\Observers\UserObserver; class User extends Model { use SoftDeletes; /** * The "booting" method of the model. * * @return void */ public static function boot() { parent::boot(); static::observe(new UserObserver); } }