domain layer - здесь хранятся Entities и Value objects. Entities имеют состояние и поведение, это и есть бизнес-логика нашей доменной модели. Также здесь хранятся фабрики для создания сложных составных Entities (которые в ddd называют аггрегатами Aggregate) и интерфейсы репозиториев.
infrastructure layer - здесь хранятся реализации репозиториев и сервисов, которые зависят от инфраструктуры. Например наш MailerService, который отправляет элекронные письма зависит от низкоуровневой библиотеки, например такой как swiftmailer и поэтому должен находится в этом слое.
application layer - здесь хранятся реализации сервисов, которые относятся к уровню приложения. Мне это сложно объяснить, поэтому я попробую показать на примере псевдокода как может выглядеть сервис уровня приложения для регистрации нового пользователя на сайте:
Код: Выделить всё
namespace app\src\application;
use app\src\domain\entities\user\User;
use app\src\domain\entities\user\UserRepositoryInterface;
use app\src\infrastructure\MailerServiceInterface;
class UserService {
__construct(UserRepositoryInterface $userRepository, MailerServiceInterface $mailerService) {
$this->userRepository = $userRepository;
$this->mailerService = $mailerService;
}
signup(Request $request) {
$params = $request->getPostParams();
$user = new User($params->email, $params->password);
$this->userRepository->save($user);
$this->mailerService
->setFrom('from@domain.com')
->setTo($user->email)
->setSubject('Вы успешно зарегистрировались')
->setBody('Поздравляем!');
return $user;
}
}
В итоге entities с бизнес-логикой в domain layer не зависят от других слоев и мы можем их таскать из фреймворка в фреймворк (окружение). Сервисы из application layer тоже можно таскать, но для них нужно разрешить зависимости из infrastructure layer. Самый нестабильный код получается инкапсулирован в infrastructure layer и если например меняется swiftmailer на что-то другое, то мы пишем новую реализацию и тоже самое с репозиториями.
Здесь я уверен далеко не всё, в ddd там дофига всего, но скажите верно ли я понял основую суть ddd архитектуры или нет?