Bonjour,
Voila je rencontre un petit problème avec mon code.
Une intance d'objet (Territory) est passé en paramètre d'une entité (Actualite).
J'ai typé le paramètre afin de m'assurer qu'il soit correct.
Mon code est fort simple :
public function setEntite(Territory $territory)
{
$this -> entite = $territory;
return $this;
}
Un simple var_dump me permet de vérifier que la variable $territory a bien été instanciée et est du bon type.
Dans postman, j'obtiens un message d'erreur m'indiquant que la variable passée est null:
Type error: Argument 1 passed to APIBundle\Entity\Actualite::setEntite() must be an instance of APIBundle\Entity\Territory, null given
lorsque je passe mon objet à mon attribut.
Alors le problème vient en fait du contrôleur.
On passe bien le paramètre à la fonction mais celui-ci est automatiquement remplacé par celui présent dans les valeurs POST c'est à dire null et réécrite par le formulaire.
Donc la solution que j'ai adopté est la suivante :
public function postActualiteAction(Request $request)
{
$em = $this -> get('doctrine.orm.entity_manager');
$territory = $em -> getRepository('APIBundle:Territory')
-> find($request -> get('territory_id'));
if (empty($territory)) return TerritoryController::notFound();
$news = new Actualite();
$form = $this -> createForm(ActualiteType::class, $news);
$form -> submit($request -> request -> all());
if ($form -> isValid()) {
$news -> setEntite($territory);
$this -> em -> persist($news);
$this -> em -> flush();
return $news;
} else {
return $form;
}
}
"null given" pourtant, ca veux dire ce que ca veux dire, l'objet passé est null. t'es sur que $territory est vraiment bien instancié ?
Bonsoir et merci pour votre réponse.
C'est un peu à ne rien y comprendre.
Lorsque je fait un var_dump() comme ceci :
public function setEntite(Territory $territory)
{
var_dump($territory);
$this -> entite = $territory;
return $this;
}
j'obtiens :
.../api/src/APIBundle/Entity/Actualite.php:235:
object(APIBundle\Entity\Territory)[494]
private 'id' => int 2
private 'nom' => string 'Covoiturons' (length=11)
private 'slug' => string 'Covoiturons' (length=11)
private 'logo' => null
private 'baseline' => null
private 'networkTransportLink' => null
private 'networktransportLinkPicture' => null
private 'color' => null
private 'email' => string 'covoiturons@rezopouce.fr' (length=24)
private 'state' => string 'enplace' (length=7)
private 'typeEntite' =>
object(Proxies\__CG__\APIBundle\Entity\TypeTerritory)[590]
public '__initializer__' =>
object(Closure)[486]
public 'static' =>
array (size=2)
...
mon objet.
public function setEntite(Territory $territory = null) {
//[...]
}
Quand doctrine récupère une Entity qui n'a pas encore sa relation de faite, il init celle-ci à null. Tu dois donc autoriser le type null par defaut.
J'entends bien ce que vous me dite mais
$territory = null
induit que si la variable $territory n'est pas passée en paramètre à la fonction setEntite(...) alors la valeur par défault à utiliser est null.
Mon controlleur en amont de cet appel de fonction est celui-ci :
public function postActualiteAction(Request $request)
{
$em = $this -> get('doctrine.orm.entity_manager');
$territory = $em -> getRepository('APIBundle:Territory')
-> find($request -> get('territory_id'));
if (empty($territory)) return TerritoryController::notFound();
$news = new Actualite();
$news -> setEntite($territory);
$form = $this -> createForm(ActualiteType::class, $news);
$form -> submit($request -> request -> all());
if ($form -> isValid()) {
$em = $this -> get('doctrine.orm.entity_manager');
$em -> persist($news);
$em -> flush();
return $news;
} else {
return $form;
}
}
L'objet Territory est bien instancié mais n'est vraisemblablement pas passé en paramètre correctement.
Avec votre solution, on accepte que $territory puisse ne pas être passé en paramètre ; or non.
Avec votre solution, il n'y a effectivement plus de message d'erreur et l'objet est bien créé puis sauvegardé en bdd. Mais cela ne change rien au fait que je ne pas pas instancier mon attribut $entite depuis setEntitte(...) avec mon territoire.