Apprendre Symfony 3

Insérer des éléments en BDD

Programme

  1. Présentation
  2. Créer son Bundle
  3. Configurer son application
  4. Créer sa première page
  5. Créer sa première entité
  6. Insérer quelques éléments en BDD à partir d'un formulaire

Les Fixtures

Des classes PHP où on créée des objets pour les persister avec la base de donnée

Installer le bundle

composer require --dev doctrine/doctrine-fixtures-bundle

Rendre accessible le bundle pour la config de dev


							// app/AppKernel.php
							// ...

							class AppKernel extends Kernel
							{
									public function registerBundles()
									{
											// ...
											if (in_array($this->getEnvironment(), array('dev', 'test'), true)) {
													// ...
													$bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle();
											}

											return $bundles;
									}

									// ...
							}
						

Créer les éléments à insérer


							// src/AppBundle/DataFixtures/ORM/Fixtures.php

							namespace AppBundle\DataFixtures\ORM;

							use AppBundle\Entity\Article;
							use Doctrine\Bundle\FixturesBundle\Fixture;
							use Doctrine\Common\Persistence\ObjectManager;

							class Fixtures extends Fixture
							{
									public function load(ObjectManager $manager)
									{
									// create 20 articles! Bam!
									for ($i = 0; $i < 20; $i++) {

											$date = new \DateTime("now");

											$article = new Article();
											$article->setName('article '.$i);
											$article->setContent('bmamba');
											$article->setCreated($date);
											$article->setPublished($date);
											$article->setAuthor('yoyoyo');
											$manager->persist($article);
									}

									$manager->flush();
									}
							}
						

Insérer dans le base de donnée

php bin/console doctrine:fixtures:load

Pour éviter de purger la base

php bin/console doctrine:fixtures:load --append

Les relations entre les entités


							// src/AppBundle/AppBundle\Entity\Article;

							/**
								* @ORM\ManyToOne(targetEntity="Category", inversedBy="articles")
								* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
								*/
							 private $category;
						 


							 // src/AppBundle/AppBundle\Entity\Category;
								use Doctrine\Common\Collections\ArrayCollection;

							/**
								* @ORM\OneToMany(targetEntity="Article", mappedBy="category")
								*/
							 private $articles;
						

Générer des formulaires


							// src/AppBundle/Controller/DefaultController.php
									namespace AppBundle\Controller;

									use AppBundle\Entity\Article;
									use Symfony\Bundle\FrameworkBundle\Controller\Controller;
									use Symfony\Component\HttpFoundation\Request;
									use Symfony\Component\Form\Extension\Core\Type\TextType;
									use Symfony\Component\Form\Extension\Core\Type\DateType;
									use Symfony\Component\Form\Extension\Core\Type\SubmitType;

									class DefaultController extends Controller
									{
									    public function newAction(Request $request)
									    {

											 $article = new Article();
											 $article->setName('Article vraiment Top !');
											 $article->setContent('Très intéressant!');
											 $article->setPublished(new \DateTime('tomorrow'));
											 $article->setCreated(new \DateTime('now'));
											 $article->setAuthor('Sam');

											 $form = $this->createFormBuilder($article)
													 ->add('name', TextType::class)
													 ->add('content', TextType::class)
													 ->add('published', DateType::class)
													 ->add('author', TextType::class)
													 ->add('save', SubmitType::class, array('label' => 'Create Post'))
													 ->getForm();

											 return $this->render('default/index.html.twig', array(
													 'form' => $form->createView()
											 ));
									    }
									}
						

Dans Twig


            {{ form_start(form) }}
            {{ form_widget(form) }}
            {{ form_end(form) }}
						

Pour insérer les résultats du formulaire dans la base


							// src/AppBundle/Controller/DefaultController.php
									namespace AppBundle\Controller;

									use AppBundle\Entity\Article;
									use Symfony\Bundle\FrameworkBundle\Controller\Controller;
									use Symfony\Component\HttpFoundation\Request;
									use Symfony\Component\Form\Extension\Core\Type\TextType;
									use Symfony\Component\Form\Extension\Core\Type\DateType;
									use Symfony\Component\Form\Extension\Core\Type\SubmitType;

									class DefaultController extends Controller
									{
									    public function newAction(Request $request)
									    {

											 $article = new Article();
											 $article->setName('Article vraiment Top !');
											 $article->setContent('Très intéressant!');
											 $article->setPublished(new \DateTime('tomorrow'));
											 $article->setCreated(new \DateTime('now'));
											 $article->setAuthor('Sam');

											 $form = $this->createFormBuilder($article)
													 ->add('name', TextType::class)
													 ->add('content', TextType::class)
													 ->add('published', DateType::class)
													 ->add('author', TextType::class)
													 ->add('save', SubmitType::class, array('label' => 'Create Post'))
													 ->getForm();

											 $form->handleRequest($request);

											 if ($form->isSubmitted() && $form->isValid()) {

													 $article = $form->getData();

														$em = $this->getDoctrine()->getManager();
														$em->persist($article);
														$em->flush();

											 }

											 return $this->render('default/index.html.twig', array(
													 'form' => $form->createView()
											 ));
									    }
									}