Какой механизм позволяет быстро выполнить действие при создании сущности?

«Какой механизм позволяет быстро выполнить действие при создании сущности?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В архитектуре приложений для выполнения действий при создании сущности я использую события (Events) или хуки жизненного цикла (Lifecycle Hooks) в ORM. Это позволяет отделить побочную логику (логирование, отправку уведомлений, вычисление производных полей) от основной бизнес-логики создания.

Пример с событиями в рамках чистой архитектуры:

// 1. Создаем событие
class ProductWasCreated {
    public function __construct(public Product $product) {}
}

// 2. Сервис создания продукта генерирует событие
class CreateProductService {
    public function __construct(private EventDispatcher $dispatcher) {}

    public function execute(CreateProductCommand $command): Product {
        $product = new Product($command->name, $command->price);
        // ... сохранение в репозитории

        $this->dispatcher->dispatch(new ProductWasCreated($product));
        return $product;
    }
}

// 3. Отдельный обработчик реагирует на событие
class SendWelcomeEmailOnProductCreation {
    public function __invoke(ProductWasCreated $event): void {
        $product = $event->product;
        // Отправка email, запись в аудит-лог и т.д.
    }
}

Плюсы подхода:

  • Гибкость и расширяемость: Новые действия добавляются как независимые обработчики, не изменяя основной код.
  • Тестируемость: Логику создания и побочные действия можно тестировать изолированно.
  • Асинхронность: Обработчики можно вынести в очередь задач (например, через RabbitMQ), чтобы не блокировать ответ пользователю.

Для простых случаев в рамках фреймворка (например, Laravel Eloquent или Doctrine) можно использовать встроенные хуки creating/created или аннотации @PrePersist.