РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
342 of 1392 menu

Событие trashed

Событие trashed в Laravel возникает после мягкого удаления модели, то есть после установки значения в колонку deleted_at. Событие передаёт экземпляр модели, которая была перемещена в корзину. Это событие полезно для выполнения дополнительных действий, таких как логирование, отправка уведомлений, очистка кеша или изменение связанных записей. Событие не срабатывает при использовании метода forceDelete, так как модель удаляется полностью.

Для использования события необходимо определить его в классе модели в свойстве dispatchesEvents или создать отдельный класс слушателя. Также событие можно обработать через наблюдение за моделью (Observer).

Событие trashed относится к модели и не зависит от каких-либо дополнительных параметров. Оно автоматически получает экземпляр модели через свойство model.

Синтаксис

<?php class ModelName extends Model { use SoftDeletes; protected $dispatchesEvents = [ 'trashed' => TrashedEvent::class, ]; } ?>

Для использования события модели необходимо:

<?php // В модели use IlluminateDatabaseEloquentModel; use IlluminateDatabaseEloquentSoftDeletes; class Article extends Model { use SoftDeletes; protected $dispatchesEvents = [ 'trashed' => ArticleTrashedEvent::class, ]; } // Класс события use IlluminateDatabaseEloquentModel; use IlluminateFoundationEventsDispatchable; use IlluminateQueueSerializesModels; class ArticleTrashedEvent { use Dispatchable, SerializesModels; public $article; public function __construct(Article $article) { $this->article = $article; } } ?>

Также можно использовать слушатель:

<?php // В сервис-провайдере protected $listen = [ 'IlluminateDatabaseEventsModelsTrashed' => [ 'AppListenersLogTrashedAction', ], ]; // Класс слушателя namespace AppListeners; class LogTrashedAction { public function handle($event) { // Логирование действия Log::info('Model trashed: ' . get_class($event->model)); } } ?>

Или использовать Observer:

<?php // В методе boot сервис-провайдера Article::observe(ArticleObserver::class); // Класс Observer namespace AppObservers; use AppModelsArticle; class ArticleObserver { public function trashed(Article $article) { // Действия при перемещении в корзину Cache::forget('articles_' . $article->id); } } ?>

Для генерации события необходимо мягко удалить модель:

<?php use AppModelsArticle; $article = Article::find(1); $article->delete(); // Событие trashed сработает ?>

Событие не сработает при полном удалении:

<?php use AppModelsArticle; $article = Article::find(1); $article->forceDelete(); // Событие trashed НЕ сработает ?>

Событие trashed также срабатывает при массовом мягком удалении:

<?php use AppModelsArticle; $res = Article::where('status', 'draft')->delete(); // Событие trashed сработает для каждой удалённой модели ?>

Результат выполнения кода:

"5 articles moved to trash"

При использовании массового удаления событие срабатывает для каждой модели отдельно, что может быть ресурсоёмко при большом количестве записей. В таких случаях рекомендуется использовать массовые операции с учётом этого ограничения.

Пример с Observer

Рассмотрим пример использования Observer для обработки события trashed при мягком удалении статьи:

<?php namespace AppModels; use IlluminateDatabaseEloquentModel; use IlluminateDatabaseEloquentSoftDeletes; class Article extends Model { use SoftDeletes; protected $fillable = [ 'title', 'body', 'user_id', 'status', ]; } ?>
<?php namespace AppObservers; use AppModelsArticle; use IlluminateSupportFacadesCache; use IlluminateSupportFacadesLog; class ArticleObserver { public function trashed(Article $article) { // Очищаем кеш статьи Cache::forget('article_' . $article->id); // Логируем действие Log::info('Article ' . $article->id . ' moved to trash'); // Обновляем связанные записи if ($article->comments()->exists()) { $article->comments()->update(['hidden' => true]); } } } ?>
<?php namespace AppProviders; use AppModelsArticle; use AppObserversArticleObserver; use IlluminateSupportServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Article::observe(ArticleObserver::class); } } ?>
<?php namespace AppHttpControllers; use AppModelsArticle; class ArticleController extends Controller { public function delete($id) { $article = Article::findOrFail($id); $article->delete(); return redirect('/articles') ->with('message', 'Article moved to trash'); } } ?>

При вызове метода delete сработает событие trashed, после чего кеш будет очищен, действие залогировано, а комментарии статьи скрыты. Это позволяет автоматически поддерживать целостность данных при мягком удалении.

Пример с Event Listener

Рассмотрим альтернативный способ через систему событий Laravel. Создадим событие и слушатель для обработки перемещения категории в корзину:

<?php namespace AppModels; use IlluminateDatabaseEloquentModel; use IlluminateDatabaseEloquentSoftDeletes; class Category extends Model { use SoftDeletes; protected $fillable = [ 'name', 'slug', 'description', ]; } ?>
<?php namespace AppEvents; use AppModelsCategory; use IlluminateFoundationEventsDispatchable; use IlluminateQueueSerializesModels; class CategoryTrashedEvent { use Dispatchable, SerializesModels; public $category; public function __construct(Category $category) { $this->category = $category; } } ?>
<?php namespace AppListeners; use AppEventsCategoryTrashedEvent; use AppModelsCategory; use IlluminateSupportFacadesLog; class CategoryTrashedListener { public function handle(CategoryTrashedEvent $event) { $category = $event->category; // Логируем перемещение в корзину Log::warning('Category trashed: ' . $category->name); // Удаляем slug из кеша Cache::forget('category_slug_' . $category->slug); // Снимаем привязку у подкатегорий Category::where('parent_id', $category->id) ->update(['parent_id' => null]); } } ?>
<?php namespace AppModels; use IlluminateDatabaseEloquentModel; use IlluminateDatabaseEloquentSoftDeletes; class Category extends Model { use SoftDeletes; protected $dispatchesEvents = [ 'trashed' => AppEventsCategoryTrashedEvent::class, ]; } ?>
<?php namespace AppHttpControllers; use AppModelsCategory; class CategoryController extends Controller { public function destroy($id) { $category = Category::findOrFail($id); $category->delete(); return response()->json([ 'message' => 'Category moved to trash', ]); } } ?>

Результат выполнения кода при удалении категории:

{ "message": "Category moved to trash" }

В логах появится запись о перемещении категории в корзину, кеш будет очищен, а подкатегории будут отвязаны от удаляемой категории. Это демонстрирует, как событие trashed позволяет выполнять сложную бизнес-логику при мягком удалении.

Смотрите также

  • метод restoring,
    который срабатывает перед восстановлением модели из корзины
  • метод restored,
    который срабатывает после восстановления модели из корзины
  • метод delete,
    который выполняет мягкое удаление модели
  • класс SoftDeletes,
    трейт для добавления функциональности мягкого удаления
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить