Событие forceDeleted
Событие forceDeleted возникает в момент, когда модель Eloquent
была окончательно удалена из базы данных с помощью метода
forceDelete. Это событие не срабатывает при обычном удалении,
если модель использует трейт SoftDeletes. Оно позволяет
выполнить дополнительные действия после того, как запись была
полностью стёрта из базы данных, без возможности восстановления.
Событие передаёт удалённую модель в качестве аргумента
обработчику или слушателю.
Синтаксис
<?php
Model::forceDeleted(function ($model) {
// Действия после принудительного удаления
});
?>
Пример
Давайте зарегистрируем обработчик события forceDeleted
в модели Article:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Article extends Model
{
use SoftDeletes;
protected $fillable = ['title', 'content', 'user_id'];
protected static function booted()
{
static::forceDeleted(function ($article) {
\Log::info('Article force deleted: ' . $article->id);
});
}
}
?>
Теперь при принудительном удалении статьи в лог будет записано сообщение с идентификатором удалённой записи.
Пример
Давайте создадим слушатель события forceDeleted
для очистки связанных данных:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Models\Article;
use App\Listeners\ClearArticleCache;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
'eloquent.forceDeleted: App\Models\Article' => [
ClearArticleCache::class,
],
];
}
?>
Пример
Давайте определим слушатель, который выполняет очистку кэша после принудительного удаления модели:
<?php
namespace App\Listeners;
use App\Models\Article;
use Illuminate\Support\Facades\Cache;
class ClearArticleCache
{
public function handle(Article $article)
{
Cache::forget('articles_list');
Cache::forget('article_' . $article->id);
\Log::info('Cache cleared for article: ' . $article->id);
}
}
?>
Результат выполнения кода при принудительном удалении статьи:
"Cache cleared for article: 1"
Пример
Давайте используем анонимный обработчик события forceDeleted
в контроллере для выполнения дополнительных действий:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ArticleController extends Controller
{
public function forceDelete($id)
{
$article = Article::withTrashed()->find($id);
if ($article) {
Article::forceDeleted(function ($model) use ($article) {
DB::table('article_logs')->insert([
'article_id' => $article->id,
'action' => 'force_deleted',
'created_at' => now(),
]);
});
$article->forceDelete();
return response()->json(['message' => 'Article permanently deleted']);
}
return response()->json(['message' => 'Article not found'], 404);
}
}
?>
Результат выполнения кода при успешном принудительном удалении:
{"message":"Article permanently deleted"}
Смотрите также
-
событие
forceDeleting,
которое вызывается перед принудительным удалением -
событие
deleted,
которое вызывается после обычного удаления -
метод
forceDelete,
который выполняет принудительное удаление модели -
метод
delete,
который выполняет обычное удаление модели