Связь между модулями

Обсуждаем, как правильно строить приложения
Ответить
marad3r
Сообщения: 2
Зарегистрирован: 2017.12.25, 13:26

Связь между модулями

Сообщение marad3r »

Господа, разбираюсь в вопросе выделения некоторых объектов в проекте в отдельные независимые модули.
Возник такой архитектурный вопрос.

Допустим, есть некий модуль Comment. У модуля есть виджет комментариев, который обращается в CommentService за списком комментариев. CommentService получает эти данные из CommentRepository. Все хорошо пока я работаю с данными в рамках данного модуля. Но у каждого комментария есть автор, и я хочу достать данные по юзеру из модуля User (например, getName() и getPhoto()).
Получается мне надо сходить в UserRepository, получить оттуда сущность или сразу DTO для виджета.

Не имею опыта в этом вопросе и пока не допетрил как объявить эту зависимость, кроме как обложить модуль User интерфейсами, которые требуются для модуля Comment. Либо я вижу решение в написании сущности и репозитория для юзера в рамках модуля Comment. Но тогда в обоих модулях UserRepository зависит от хранилища данных.

Посоветуйте, как лучше настроить связь между модулями.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Связь между модулями

Сообщение samdark »

Но у каждого комментария есть автор, и я хочу достать данные по юзеру из модуля User (например, getName() и getPhoto()).
Получается мне надо сходить в UserRepository, получить оттуда сущность или сразу DTO для виджета.
На самом деле нет. Комментарию нужны автора и его фото. Вы декларируете это в интерфейсе и требуете для работы модуля предоставить экземпляр этого интерефейса:

Код: Выделить всё

interface AuthorInfoProvider
{
    public function getName(Comment $comment);
    public function getPhoto(Comment $comment);
}
кроме как обложить модуль User интерфейсами, которые требуются для модуля Comment
Так и есть.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Связь между модулями

Сообщение zelenin »

Код: Выделить всё

CommentRepository::findComment($id) {
    $comment = $this->db->find('comment', ['id' => $id]);
    
     // в реализации провайдера вытаскиваем инстанс \UserModule\User и перепаковываем в \CommentModule\Author
     // а можно напрямую в базу сходить
    $author = $this->authorProvider->findByComment($comment);
    $comment->setAuthor($author);

    return $comment;
}
Для authorProvider есть интерфейс и реализация для конкретного модуля User.
marad3r
Сообщения: 2
Зарегистрирован: 2017.12.25, 13:26

Re: Связь между модулями

Сообщение marad3r »

zelenin и samdark, спасибо за ответы
Ответить