Не удалось угадать, как получить экземпляр 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, как было указано в других ответах.