web-dev-qa-db-fra.com

Impossible de deviner comment obtenir une instance de Doctrine à partir de l'information de la demande

J'ai ce "500 Erreur de serveur interne - LogicException: Impossible de deviner comment obtenir une instance de Doctrine à partir des informations de la demande ".

Voici la définition de l'action de mon contrôleur:

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

Et ça ne marche pas, probablement parce que Doctrine 2 ne peut pas "deviner" ... Alors, comment faire deviner Doctrine 2, et bien?

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

Je n'ai trouvé aucune aide dans la documentation (médiocre?) De paramconverter, car elle ne décrit pas comment cela fonctionne, comment elle devine avec plus d'un paramètre et d'autres choses. De plus, je ne suis pas sûr que cela soit nécessaire puisque ce que je viens d’écrire fonctionne correctement.

Mon mystake n’était pas d’utiliser le nom de mes attributs afin que la doctrine ne puisse deviner. J'ai remplacé {player_name} par {name} et par {collecte_id} par {id}.

Ensuite, j'ai changé les noms de mon identifiant dans leurs entités de "id" en "id_gather" et "id_player", je suis donc en mesure de le faire:

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

ce qui est beaucoup plus efficace que 

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

Maintenant, je me demande comment je peux faire ce travail

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

La doctrine ne sait pas comment utiliser les paramètres de requête pour interroger les entités spécifiées dans la signature de la fonction.

Vous devrez l'aider en spécifiant des informations de mappage:

/**
  * @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)
{
  // ...
}
28
Azr

essaye ça:

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

@ 1ed a raison, vous devez définir un @paramConverter afin d'obtenir une instance de lecteur ou une instance de collecte 

0
ftassi

Les paramètres de la signature de l'annotation @Route doivent correspondre aux champs des entités, de sorte que Doctrine effectue automatiquement la conversion.

Sinon, vous devez effectuer la conversion manuellement en utilisant l'annotation @ParamConverter comme indiqué dans les autres réponses.