Ответ
В архитектуре приложений для выполнения действий при создании сущности я использую события (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.