TrogWarZ
@TrogWarZ
web developer

Динамические данные в JsonApi от Doctrine-Модели – как?

Доброго времени, коллеги!

В наличии: Symfony 3.3, Doctrine 2.5, Neomerx/JsonApi 1.0.

Сейчас: У модели User есть закладки (в них можно добавлять разного типа сущности, включая других юзеров). С помощью Доктрины и интерфейсе IFavouritable они представлены в виде связи "один-ко-многим" таким образом:

trait HasFavorites
{
    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Favorite", mappedBy="user")
     */
    protected $favorites;

    public function getFavorites() : Collection { return $this->favorites; }
    public function addFavorite(Favorite $favorite) { $this->favorites->add($favorite); }
    public function removeFavorite(Favorite $favorite) { $this->favorites->removeElement($favorite); }
}


Теперь, в схеме (=сериализаторе?) перед самой отдачей ответа я имею объект User, который превращаю в массив, а затем в json.

Вопрос: в моделях с интерфейсом нужно отдавать значение "есть ли этот объект в закладках текущего залогиненного пользователя". Как вы бы это решили?

Варианты:
– С помощью DI в схему добавить репозиторий и аутентификатор, делать запросы с проверкой из схемы. Мне не нравится этот вариант тем, что при отдаче 100 объектов будет 100+ запросов в базу для уточнения этого аттрибута.
– Передавать в модель репозиторий и текущего юзера. Проблемы те же что и в примере выше, плюс ещё и модель начинает знать о хранилище.
– ???
  • Вопрос задан
  • 529 просмотров
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Я за первый вариант:
- Инжектим в OrderNormalizer репозиторий с избранным
- При сериализации сущности вытаскиваем все избранное залогинненого пользователя и кладем в кеш
- При последующей сериализации за избранным уже идем в кеш, а не в БД
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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