Разбираюсь с DDD и не могу понять, кто производит действия над агрегатами. В частности, например, действие отражающие "удаление" агрегата.
Например, существует агрегат Каталог товаров (Catalog) с корневой сущностью Catalog и объектами-значениями CatalogID, Name.
Есть хранилище, используя которое можем вытащить агрегат, изменить его и сохранить обратно
$catalog = $repository->find($catalogId);
$catalog->rename('Some another name')
$repository->update($catalog);
Также в рамках другого ограниченного контекста, существуют агрегат Интеграция (Integration), с корневой сущностью Integration, объектами значениями IntegrationId, Name и коллекцией объектов значений EntityRelations. С помощью этого агрегата у нас есть возможность связать нашу любую сущность из предметной области с сущностью стороннего интегрируемого сервиса (ERP, 1C)
...
$integration->addRelation(new EntityRelation('catalog', $catalog->id(), $externalCatalogId));
$integrationRepository->update($integration);
И теперь собственно вопрос, как мне "удалить" каталог таким образом, чтобы он "удалился" вместе со всеми интеграционными связями? Очевидно, можно ввести событие "CatalogDeleted", подписаться на него и "удалять" связанные с этим каталогом интеграционные связи. Но как Catalog узнает, что он "удаляется"?
Есть идея внутри сущности Catalog объявить защищенный метод onDelete(), и в хранилище через рефлексию его дергать.
class Catalog extends AbstractEntity
{
...
protected function onDelete()
{
$eventManager->dispatch(new CatalogDeleted($this->id()));
}
...
}
class CatalogRepository extends AbstractRepository implements CatalogRepositoryInterface
{
...
public function delete(Catalog $catalog)
{
$method = new \ReflectionMethod($catalog, 'onDelete');
$method->setAccessible(true);
$method->invoke($catalog);
//дальше удаляем из БД
}
...
}
Можно ли считать такой подход нормальным?