Невозможно угадать, как получить экземпляр Doctrine из информации запроса - PullRequest
18 голосов
/ 15 марта 2012

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

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

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

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

Ответы [ 5 ]

29 голосов
/ 12 сентября 2013

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)
{
  // ...
}
10 голосов
/ 18 марта 2012
/**
 * @Route("/gatherplayer/{name}/{id}")
 * @Template()
 */
public function createAction(Player $player, Gather $gather)

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

Моя ошибка заключалась в том, чтобы не использовать имя моих атрибутов, чтобы доктрина не могла угадать правильно.Я изменил {player_name} на {name} и {collect_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)
3 голосов
/ 16 марта 2012

попробуйте это:

/**
 * @Route("/gatherplayer/{player_name}/{gather_id}")
 * @ParamConverter("player", class="YourBundle:Player")
 * @ParamConverter("gather", class="YourBundle:Gather")
 * @Template()
 */
public function createAction(Player $player, Gather $gather)
0 голосов
/ 23 ноября 2017

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

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

0 голосов
/ 16 марта 2012

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

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