Не удалось угадать, как получить экземпляр Doctrine из информации запроса

У меня есть эта "500 Internal Server Error - LogicException: Невозможно угадать, как получить экземпляр Doctrine из информации запроса".

Вот мое определение действия контроллера:

/**
 * @Route("/gatherplayer/{player_name}/{gather_id}")
 * @Template()
 */
public function createAction(Player $player, Gather $gather)
{
  // ...
}

И это не работает, возможно потому, что Doctrine 2 не может "догадываться"... Итак, как я могу угадать Doctrine 2 и хорошо?

Ответы

Ответ 1

/**
 * @Route("/gatherplayer/{name}/{id}")
 * @Template()
 */
public function createAction(Player $player, Gather $gather)

Я не нашел никакой помощи в документации paramconverter (плохой?), поскольку он не описывает, как он работает, как он догадывается с несколькими параметрами и т.д. Плюс я не уверен, что это необходимо, так как то, что я только что написал, работает правильно.

Мой мистик не должен был использовать имя моих атрибутов, поэтому доктрина не могла угадать. Я изменил {player_name} на {name} и {gather_id} на {id}.

Затем я изменил имена своего идентификатора в своих объектах с "id" на "id_gather" и "id_player", поэтому теперь я могу это сделать:

/**
 * @Route("/gatherplayer/{id_player}/{id_gather}")
 * @Template()
 */
public function createAction(Player $player, Gather $gather)

что намного эффективнее, чем

 * @Route("/gatherplayer/{id}/{id}")

Теперь мне интересно, как я могу сделать эту работу.

 /**
  * @Route("/gatherplayer/{player}/{gather}")
  * @Template()
  */
 public function deleteAction(Gather_Player $gather_player)

Ответ 2

Doctrine не знает, как использовать параметры запроса для запроса объектов, указанных в сигнатуре функции.

Вам нужно будет помочь, указав некоторую информацию о карте:

/**
  * @Route("/gatherplayer/{player_name}/{gather_id}")
  *
  * @ParamConverter("player", options={"mapping": {"player_name" : "name"}})
  * @ParamConverter("gather", options={"mapping": {"gather_id"   : "id"}})
  *
  * @Template()
  */
public function createAction(Player $player, Gather $gather)
{
  // ...
}

Ответ 3

попробуйте следующее:

/**
 * @Route("/gatherplayer/{player_name}/{gather_id}")
 * @ParamConverter("player", class="YourBundle:Player")
 * @ParamConverter("gather", class="YourBundle:Gather")
 * @Template()
 */
public function createAction(Player $player, Gather $gather)

Ответ 4

@1ed правильно, вы должны определить @paramConverter, чтобы получить экземпляр Player или экземпляр Gather.

Ответ 5

Параметры подписи аннотации @Route должны совпадать с полями сущностей, поэтому Doctrine автоматически выполняет преобразование.

В противном случае вам нужно сделать преобразование вручную, используя аннотацию @ParamConverter, как было указано в других ответах.