@Route - Как убедиться, что доктрина также проверяет родительские объекты - PullRequest
0 голосов
/ 28 октября 2018

У меня есть несколько маршрутов в моих проектах, которые являются результатом длинного отношения родитель / потомок.

Дело в том, что Symfony ищет сущность только по ее идентификатору.Игнорирование всех других параметров в маршруте.

Например, у меня есть этот маршрут:

@Route("/projets/projet-{projet}/murs/mur-{mur}/obstacles/obstacle-{id}/", name="obstacle_edit")
editAction(Request $request, Obstacle $obstacle) {}

Здесь obstacle - это искомая сущность, которую я ищу.
mur is $obstacle->getMur()
и projet is obstacle->getMur()->getProjet()

Таким образом, мой тег form выглядит следующим образом:

<form action="{{ path('obstacle_edit', { 'projet': obstacle.mur.projet.id, 'mur': obstacle.mur.id, 'id': obstacle.id }) }}" method="POST"></form

Тем не менее, Doctrine выполняет этот запрос:

SELECT 
  t0.id AS id_1, 
  t0.nom AS nom_2, 
  t0.posx AS posx_3, 
  t0.posy AS posy_4, 
  t0.posz AS posz_5, 
  t0.dimx AS dimx_6, 
  t0.dimy AS dimy_7, 
  t0.dimz AS dimz_8, 
  t0.mur_id AS mur_id_9 
FROM 
  obstacle t0 
WHERE 
  t0.id = ?

Таким образом, игнорируя два других параметра в маршруте.

Как я могу убедиться, что другие параметры не будут проигнорированы?

1 Ответ

0 голосов
/ 28 октября 2018

Вы можете изменить способ загрузки объекта, явно переопределив поведение с помощью аннотации.См .: https://symfony.com/doc/master/bundles/SensioFrameworkExtraBundle/annotations/converters.html#fetch-via-an-expression

В вашем случае это может выглядеть примерно так:

/**
 * @Route("/projets/projet-{projet}/murs/mur-{mur}/obstacles/obstacle-{id}/", name="obstacle_edit")
 * @Entity("obstacle", expr="repository.findObstacleByProjectMurAndId(projet, mur, id)")
 */
public function editAction(Request $request, Obstacle $obstacle) { ... }

Фактическая логика запроса, которую вы затем помещаете в этот репозиторий.В зависимости от того, что именно вы хотите, это может быть так же просто, как завершение findBy(['mur' => $mur, 'projet' => $projet, 'id' => $id]) или более сложный запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...