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) :
<?php namespace App\Controller; use Symfony\Component\Routing\Annotation\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use App\Entity\Product; use Symfony\Component\HttpFoundation\Response; class ProductController extends Controller { /** * @Route("/product", name="product") */ public function index() { // you can fetch the EntityManager via $this->getDoctrine() // or you can add an argument to your action: index(EntityManagerInterface $entityManager) $entityManager = $this->getDoctrine()->getManager(); $product = new Product(); $product->setName('Keyboard'); $product->setPrice(1999); $product->setDescription('Ergonomic and stylish!'); // tell Doctrine you want to (eventually) save the Product (no queries yet) $entityManager->persist($product); // actually executes the queries (i.e. the INSERT query) return new Response('Saved new product with id '.$product->getId()); } }
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 :
... /** * @Route("/product/{id}", name="product_show") */ public function show($id) { $product = $this->getDoctrine() ->getRepository(Product::class) ->find($id); if (!$product) { throw $this->createNotFoundException( 'No product found for id '.$id ); } return new Response('Check out this great product: '.$product->getName()); // or render a template // in the template, print things with {{ product.name }} // return $this->render('product/show.html.twig', ['product' => $product]); } ...
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 :
<?php namespace App\Controller; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\HttpFoundation\Response; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use App\Entity\Product; class ProductController extends Controller { /** * @Route("/product", name="product") */ public function index() { // you can fetch the EntityManager via $this->getDoctrine() // or you can add an argument to your action: index(EntityManagerInterface $entityManager) $entityManager = $this->getDoctrine()->getManager(); $product = new Product(); $product->setName('Keyboard'); $product->setPrice(1999); $product->setDescription('Ergonomic and stylish!'); // tell Doctrine you want to (eventually) save the Product (no queries yet) $entityManager->persist($product); // actually executes the queries (i.e. the INSERT query) return new Response('Saved new product with id '.$product->getId()); } /** * @Route("/product/{id}", name="product_show") */ public function show(Product $product) { return new Response('Check out this great product: '.$product->getName()); } }
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);
}
...