Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

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.

Ce que j'obtiens

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.

6 réponses


Olivier.f
Auteur
Réponse acceptée

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;
        }
    }
  1. On trouve le territoire,
  2. On Crée l'actu,
  3. On valide le formulaire,
  4. On attribue le territoire à l'actu
  5. On persiste et on enregistre.

"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.