Index de l'article

Contrôleur

Créer un contrôleur

php bin/console make:controller VotrePremierController

Un fichier PHP se crée dans src/Controller, avec le nom choisi.

Ajoutez-y la mention de votre entité lié, en ajoutant un use dans le fichier :

use App\Entity\VotreEntity;

Une page est déjà dispo dans http://localhost/Symfony-web/public/VotreControleur. Ainsi qu'un template dans src/templates.

Ajoutez également un use de type Response :

use Symfony\Component\HttpFoundation\Response;

Tester l'enregistrement en BDD

En modifiant ainsi votre contrôleur, puis en rafraîchissant la page, vous devriez pouvoir enregistrer quelques données (en dur dans l'exemple) :

  1. <?php
  2.  
  3. namespace App\Controller;
  4.  
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  7. use App\Entity\Product;
  8. use Symfony\Component\HttpFoundation\Response;
  9.  
  10. class ProductController extends Controller
  11. {
  12. /**
  13. * @Route("/product", name="product")
  14. */
  15. public function index()
  16. {
  17. // you can fetch the EntityManager via $this->getDoctrine()
  18. // or you can add an argument to your action: index(EntityManagerInterface $entityManager)
  19. $entityManager = $this->getDoctrine()->getManager();
  20.  
  21. $product = new Product();
  22. $product->setName('Keyboard');
  23. $product->setPrice(1999);
  24. $product->setDescription('Ergonomic and stylish!');
  25.  
  26. // tell Doctrine you want to (eventually) save the Product (no queries yet)
  27. $entityManager->persist($product);
  28.  
  29. // actually executes the queries (i.e. the INSERT query)
  30. $entityManager->flush();
  31.  
  32. return new Response('Saved new product with id '.$product->getId());
  33. }
  34. }

Tester l'affichage de données sur une page web

En ajoutant une fonction show dans la classe du contrôleur, avec sa route, vous pourrez afficher les données depuis les URLS de type http://localhost/Symfony-web/public/product/1 :

  1. ...
  2. /**
  3. * @Route("/product/{id}", name="product_show")
  4. */
  5. public function show($id)
  6. {
  7. $product = $this->getDoctrine()
  8. ->getRepository(Product::class)
  9. ->find($id);
  10.  
  11. if (!$product) {
  12. throw $this->createNotFoundException(
  13. 'No product found for id '.$id
  14. );
  15. }
  16.  
  17. return new Response('Check out this great product: '.$product->getName());
  18. // or render a template
  19. // in the template, print things with {{ product.name }}
  20. // return $this->render('product/show.html.twig', ['product' => $product]);
  21. }
  22. ...

Simplifier le contrôleur avec framework-extra-bundle

Si framework-extra-bundle est installé (voir chapitre Installation), vous pouvez simplifier la méthode show de votre contrôleur, qui ressemblera finalement à cela :

  1. <?php
  2.  
  3. namespace App\Controller;
  4.  
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  8. use App\Entity\Product;
  9.  
  10. class ProductController extends Controller
  11. {
  12. /**
  13. * @Route("/product", name="product")
  14. */
  15. public function index()
  16. {
  17. // you can fetch the EntityManager via $this->getDoctrine()
  18. // or you can add an argument to your action: index(EntityManagerInterface $entityManager)
  19. $entityManager = $this->getDoctrine()->getManager();
  20.  
  21. $product = new Product();
  22. $product->setName('Keyboard');
  23. $product->setPrice(1999);
  24. $product->setDescription('Ergonomic and stylish!');
  25.  
  26. // tell Doctrine you want to (eventually) save the Product (no queries yet)
  27. $entityManager->persist($product);
  28.  
  29. // actually executes the queries (i.e. the INSERT query)
  30. $entityManager->flush();
  31.  
  32. return new Response('Saved new product with id '.$product->getId());
  33. }
  34.  
  35. /**
  36. * @Route("/product/{id}", name="product_show")
  37. */
  38. public function show(Product $product)
  39. {
  40. return new Response('Check out this great product: '.$product->getName());
  41. }
  42.  
  43. }

Tester la mise à jour de données

Dans la classe de votre contrôleur :

...
/**
* @Route("/product/edit/{id}")
*/
public function update($id)
{
$entityManager = $this->getDoctrine()->getManager();
$product = $entityManager->getRepository(Product::class)->find($id);

if (!$product) {
throw $this->createNotFoundException(
'No product found for id '.$id
);
}

$product->setName('New product name!');
$entityManager->flush();
return $this->redirectToRoute('product_show', [
'id' => $product->getId()
]);
}
...

Tester la suppression de données

Toujours dans la classe du contrôleur :

...
/**
* @Route("/product/delete/{id}")
*/
public function remove($id)
{
$entityManager = $this->getDoctrine()->getManager();
$product = $entityManager->getRepository(Product::class)->find($id);
if (!$product) {
throw $this->createNotFoundException(
'No product found for id '.$id
);
}

$entityManager->remove($product);
$entityManager->flush();

return new Response('Delete product '.$id);
}
...