У меня есть эти сущности
User
(ManyToMany)
Customer (OneToOne --> a customer can have a related customer)
Мое приложение работает. Теперь я хочу управлять разрешениями. Когда пользователь вошел в систему, я хочу отображать только клиентов, связанных с ним, и клиентов, связанных с детьми-клиентами.
Например,
Каждый раз, когда я использую findAll (), он находит своих клиентов.
Маршрут / пользователь / 4 / клиент / 7: если клиент 7 не связан с пользователем, в разрешении отказано
Думаю, мне нужно переопределить репозиторий доктрины или использовать EntityManagerDecorator Я просто спрашиваю, как лучше всего это понять? Спасибо !
Спасибо, избирателей не знал. Я буду использовать его в качестве дополнения к своему проекту, но он не даст того, что мне нужно в моем вопросе.




По сути, такие операции, как поиск определенных данных, следует делегировать в репозиторий. В конце концов, если вам придется искать в другом источнике данных, вы можете создать службу для этой конкретной ответственности и внедрить туда необходимые зависимости. В вашем случае я бы сказал, что вам не нужно ничего контролировать, просто создайте UserRepository и напишите там функцию, которая сделает то, что вам нужно.
Проверь это: https://symfony.com/doc/3.3/doctrine/repository.html
Почему бы вам не создать свою собственную функцию findAll () в вашем customerRepository, которая фильтрует вместе с вашим пользователем?
Что-то типа
public function findAllRelatedToUser(User $user)
{
return $this->createQueryBuilder('c')
->innerJoin('c.user', 'u')
->andWhere('u.id = :user_id')
->setParameter('user_id', $user->getId())
->getQuery()
->getResult();
}
Привет, да, это хорошая идея, но это старый проект, и у меня много репозиториев и много findAll, findBy и т. д. Во многих контроллерах. Но я думаю, что сделаю так, как ты говоришь
Наконец-то я нашел способ получше.
Доктрина фильтры
Запрос на прослушивание в ядре, если это касается моей сущности, примените мой фильтр (добавив WHERE id = xx)
Я использую это: http://blog.michaelperrin.fr/2014/12/05/doctrine-filters/
Прочтите это: symfony.com/doc/current/security/voters.html