@LazyDaemon

Как правильно использовать Repository?

Здравствуйте! Изучаю php, плавно переходя от велосипедостроения к best practices. Проектируя очередное приложение понял, что будет очень уместно использовать паттерн Репозиторий, чтоб отделить бизнес-логику от CRUD + использовать разные хранилища для разных сущностей.
Сделал два интерфейса IOUserRepository, IOPostRepository для сущностей User и Post сооствественно.
Классы для работы с бд, реализующие эти интерфейсы MySQLUserRepository и RedisPostRepository и сами классы сущностей User и Post, которые содержат логику (например User->ban(), Post->approve() и т.д)

И сразу созрел вопрос, а как организовать связь этих сущностей? Т.е при использовании ActiveRecord , я делал так User::find(1)->post()->where('is_approved', '0')->first()->approve() (пример для ELoquent). Один из выходов, который я вижу:
1) В классе User делаем array $posts
2) В классе RedisPostRepository делаем метод getPostsByUserID($user_id), который возвращает массив статей для пользователя
3) В методе load() класса MySQLUserRepository вызываем вышеуказанный метод, для заполнения массива $posts из пункта 1, но для этого необходимо передать объект класса, который реализует IOPostRepository ( в DI-контейнере делает биндинг интерфейс->класс, используется Pimple)
Самом собой, в БД связь один-ко-многим (one User -> many Posts).
Получается, при использовании этого паттерна надо делать связь на уровне репозиториев ?
P.S. Очень возможно, что я все же неверно понял суть данного паттерна. Если это так, просьба ткнуть носом в ошибки.
  • Вопрос задан
  • 263 просмотра
Решения вопроса 1
@synapse_people
сами классы сущностей User и Post, которые содержат логику (например User->ban(), Post->approve() и т.д)
Это не правильно, это должно быть в сервисном уровне
Получается, при использовании этого паттерна надо делать связь на уровне репозиториев ?
верно
А транзакции запускать в сервисах
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы