Bonjour à toutes et à tous

Voila je rencontre un petit problème avec mon code.
j'ai deux entités Course et CourseArticle liée par une association ManyToOne (plusieurs 'courseArticles' pour un 'course') .

Ensuite j'ai fait un make:crud pour chacune de ces deux entités .

Voici mes différentes classes.

class Course

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CourseRepository")
 */
class Course
{
    /**
     * @param ArrayCollection $courseArticles
     */
    public function setCourseArticles(ArrayCollection $courseArticles): void
    {

        $this->courseArticles = $courseArticles;
    }
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\CourseArticle", mappedBy="Course")
     */
    private $courseArticles;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $text;

    public function __construct()
    {
        $this->courseArticles = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return Collection|CourseArticle[]
     */
    public function getCourseArticles(): Collection
    {
        return $this->courseArticles;
    }

    public function addCourseArticle(CourseArticle $courseArticle): self
    {
        if (!$this->courseArticles->contains($courseArticle)) {
            $this->courseArticles[] = $courseArticle;
            $courseArticle->setCourse($this);
        }

        return $this;
    }

    public function removeCourseArticle(CourseArticle $courseArticle): self
    {
        if ($this->courseArticles->contains($courseArticle)) {
            $this->courseArticles->removeElement($courseArticle);
            // set the owning side to null (unless already changed)
            if ($courseArticle->getCourse() === $this) {
                $courseArticle->setCourse(null);
            }
        }

        return $this;
    }

    public function getText(): ?string
    {
        return $this->text;
    }

    public function setText(string $text): self
    {
//        dump(true);die();
        $this->text = $text;

        return $this;
    }
}

class CourseArticle

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CourseArticleRepository")
 */
class CourseArticle
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Course", inversedBy="courseArticles")
     */
    private $Course;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $title;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getCourse(): ?Course
    {
        return $this->Course;
    }

    public function setCourse(?Course $Course): self
    {
        $this->Course = $Course;

        return $this;
    }

    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function setTitle(string $title): self
    {
        $this->title = $title;

        return $this;
    }
}

formulaire de Course

<?php

namespace App\Form;

use App\Entity\Course;
use App\Entity\CourseArticle;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class CourseType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('text')
            ->add('courseArticles',EntityType::class,[
                'class'=>CourseArticle::class,
                'choice_label'=>'title',
                'multiple'=>true,
                'required'=>false
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Course::class,
        ]);
    }
}

formulaire de Course Article (CourseArticleType)

<?php

namespace App\Form;

use App\Entity\Course;
use App\Entity\CourseArticle;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class CourseArticleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('Course',EntityType::class,[
                'class'=>Course::class,
                'choice_label'=>'text',
                'multiple'=>false,
                'required'=>false
            ])

        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => CourseArticle::class,
        ]);
    }
}

CourseArticleController

<?php

namespace App\Controller;

use App\Entity\CourseArticle;
use App\Form\CourseArticleType;
use App\Repository\CourseArticleRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
 * @Route("/course/article")
 */
class CourseArticleController extends AbstractController
{
    /**
     * @Route("/", name="course_article_index", methods={"GET"})
     */
    public function index(CourseArticleRepository $courseArticleRepository): Response
    {
        return $this->render('course_article/index.html.twig', [
            'course_articles' => $courseArticleRepository->findAll(),
        ]);
    }

    /**
     * @Route("/new", name="course_article_new", methods={"GET","POST"})
     */
    public function new(Request $request): Response
    {
        $courseArticle = new CourseArticle();
        $form = $this->createForm(CourseArticleType::class, $courseArticle);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($courseArticle);
            $entityManager->flush();

            return $this->redirectToRoute('course_article_index');
        }

        return $this->render('course_article/new.html.twig', [
            'course_article' => $courseArticle,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/{id}", name="course_article_show", methods={"GET"})
     */
    public function show(CourseArticle $courseArticle): Response
    {
        return $this->render('course_article/show.html.twig', [
            'course_article' => $courseArticle,
        ]);
    }

    /**
     * @Route("/{id}/edit", name="course_article_edit", methods={"GET","POST"})
     */
    public function edit(Request $request, CourseArticle $courseArticle): Response
    {
        $form = $this->createForm(CourseArticleType::class, $courseArticle);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $this->getDoctrine()->getManager()->flush();

            return $this->redirectToRoute('course_article_index');
        }

        return $this->render('course_article/edit.html.twig', [
            'course_article' => $courseArticle,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/{id}", name="course_article_delete", methods={"DELETE"})
     */
    public function delete(Request $request, CourseArticle $courseArticle): Response
    {
        if ($this->isCsrfTokenValid('delete'.$courseArticle->getId(), $request->request->get('_token'))) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->remove($courseArticle);
            $entityManager->flush();
        }

        return $this->redirectToRoute('course_article_index');
    }
}

CourseController

<?php

namespace App\Controller;

use App\Entity\Course;
use App\Form\CourseType;
use App\Repository\CourseRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
 * @Route("/course")
 */
class CourseController extends AbstractController
{
    /**
     * @Route("/", name="course_index", methods={"GET"})
     */
    public function index(CourseRepository $courseRepository): Response
    {
        return $this->render('course/index.html.twig', [
            'courses' => $courseRepository->findAll(),
        ]);
    }

    /**
     * @Route("/new", name="course_new", methods={"GET","POST"})
     */
    public function new(Request $request): Response
    {
        $course = new Course();
        $form = $this->createForm(CourseType::class, $course);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($course);
            $entityManager->flush();

            return $this->redirectToRoute('course_index');
        }

        return $this->render('course/new.html.twig', [
            'course' => $course,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/{id}", name="course_show", methods={"GET"})
     */
    public function show(Course $course): Response
    {
        return $this->render('course/show.html.twig', [
            'course' => $course,
        ]);
    }

    /**
     * @Route("/{id}/edit", name="course_edit", methods={"GET","POST"})
     */
    public function edit(Request $request, Course $course): Response
    {
        $form = $this->createForm(CourseType::class, $course);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $this->getDoctrine()->getManager()->flush();

            return $this->redirectToRoute('course_index');
        }

        return $this->render('course/edit.html.twig', [
            'course' => $course,
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/{id}", name="course_delete", methods={"DELETE"})
     */
    public function delete(Request $request, Course $course): Response
    {
        if ($this->isCsrfTokenValid('delete'.$course->getId(), $request->request->get('_token'))) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->remove($course);
            $entityManager->flush();
        }

        return $this->redirectToRoute('course_index');
    }
}

Mon souci
Dans le formulaire des courseArticles (courseArticleType) j'arrive bien à choisir un Course déja existant ou je laisse le select vide (histoire de créer un cours après,ou je pourrai inclure ledit article). Jusque là pas de soucis.
Mais du coté de courseType (le formulaire des cours), j'ai bien une sélect qui affiche les cours, que j'arrive à sélectionner .Le soucis est que les articles qui ont été reliés à un cours ,via ce formulaire , ne semblent pas être persistés avec le cours dans la base de données.Ce qui fait que lorsque j'essaie d'afficher les articles d'un cours avec un dump cela me renvoie null , à moins que l'association n'ait été faite via le formulaire CourseArticleType (dans ce cas les articles qui avaient sélectionnés ce cours sont bel et bien affichés).

Toute aide serait la bienvenue :)
merci d'avance

1 réponse


ismael.lastlevel
Auteur
Réponse acceptée

J'ai trouvé.
Il fallait juste ajouter 'by_refence' = false pour le champ 'courseArticles' dans CourseType et le problème est résolu...
:)