Господа, разбираюсь в вопросе выделения некоторых объектов в проекте в отдельные независимые модули.
Возник такой архитектурный вопрос.
Допустим, есть некий модуль Comment. У модуля есть виджет комментариев, который обращается в CommentService за списком комментариев. CommentService получает эти данные из CommentRepository. Все хорошо пока я работаю с данными в рамках данного модуля. Но у каждого комментария есть автор, и я хочу достать данные по юзеру из модуля User (например, getName() и getPhoto()).
Получается мне надо сходить в UserRepository, получить оттуда сущность или сразу DTO для виджета.
Не имею опыта в этом вопросе и пока не допетрил как объявить эту зависимость, кроме как обложить модуль User интерфейсами, которые требуются для модуля Comment. Либо я вижу решение в написании сущности и репозитория для юзера в рамках модуля Comment. Но тогда в обоих модулях UserRepository зависит от хранилища данных.
Посоветуйте, как лучше настроить связь между модулями.
Связь между модулями
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Связь между модулями
На самом деле нет. Комментарию нужны автора и его фото. Вы декларируете это в интерфейсе и требуете для работы модуля предоставить экземпляр этого интерефейса:Но у каждого комментария есть автор, и я хочу достать данные по юзеру из модуля User (например, getName() и getPhoto()).
Получается мне надо сходить в UserRepository, получить оттуда сущность или сразу DTO для виджета.
Код: Выделить всё
interface AuthorInfoProvider
{
public function getName(Comment $comment);
public function getPhoto(Comment $comment);
}
Так и есть.кроме как обложить модуль User интерфейсами, которые требуются для модуля Comment
Нравится Yii? Давайте сделаем его лучше!.
Re: Связь между модулями
Код: Выделить всё
CommentRepository::findComment($id) {
$comment = $this->db->find('comment', ['id' => $id]);
// в реализации провайдера вытаскиваем инстанс \UserModule\User и перепаковываем в \CommentModule\Author
// а можно напрямую в базу сходить
$author = $this->authorProvider->findByComment($comment);
$comment->setAuthor($author);
return $comment;
}
Re: Связь между модулями
zelenin и samdark, спасибо за ответы