Я бы не стал в domain делать какие-то операции, которые напрямую затрагивают файлы. Возможно, я приведу не совсем корректную аналогию, но для меня это примерно как ожидать от кода
что сейчас сотрудника физически выкинут из офиса, сказав, что он уволен.
Модель лишь отражает действия из «реального» мира, но не выполняет их «по-настоящему».
В данном контексте модификация файлов — это «реальное» действие.
Как пример, если всё-таки хочется ресайз отразить в модели, я бы сделал что-то вроде следующего (Photo — aggregate root):
PHP:
// ResizePhotoHandler, application
public function handle(ResizePhoto $command) {
$photo = $this->photoRepository->findById($command->getPhotoId());
$photo->resize($command->getHeight(), $command->getWidth()); // throws InvalidPhotoSize exception?
$this->photoRepository->save($photo); // PhotoWasResized(42, 500, 600)
}
По событию PhotoWasResized я бы где-нибудь в инфраструктуре физически поменял бы размер картинки.
Модель же при этом тут носит скорее информационный характер, что фотки можно ресайзить в принципе.
Помимо этого, вероятно, модель может иметь ограничения на размер фоток (иначе выкидывается exception InvalidPhotoSize).
Но на необходимость как-то отражать ресайз стоит посмотреть и с другой стороны: возможно, это выходит за рамки твоего контекста с объявлениями. С точки зрения интерфейса, конечно, это может быть неочевидно: вот ты пишешь текст объявления, прикрепляешь фотку, тут ещё и отресайзить её захотел... Но по факту понятие «фотка» в первом контексте может быть просто value object'ом (тупо имя/адрес, даже метаданные, возможно, не нужны), а во втором — «фотка» может быть частью достаточно большого контекста, связанного с редактированием фотографии, быть сущностью, иметь свой жизненный цикл и т.д.
И если посмотреть с этой стороны, то можно одному контексту уделить больше внимания (domain modelling), а в другом — CRUD all the things.
Почитай на тему bounded contexts, это одно из ключевых понятий в DDD. Невозможно (и нерационально) везде пытаться внедрять DDD и пытаться всё делить на слои. Некоторые контексты это не заслуживают, задача программиста в том, чтобы это почувствовать и не утонуть в overengineering'е.