Un contrôleur permet de réaliser diverses opérations et récupérer et mettre en forme les données avant de les communiquer à la vue.
Sous la symfony 4, l'ajout d'un contrôleur se fait par la commande suivante :
php bin/console make:controller XXXXXXController
XXXXXX étant le nom de la classe ou de l'action souhaité
Les méthodes sont à ajouté manuellement.
Depuis la version 4, l'ajout du nom Action au nom de la méthode n'est plus nécessaire. Le nom doit cependant rester évocateur et précis.
Pour les méthodes CRUD (create, read, update, delete), on utilisera les noms de méthodes suivant :
Pour les autres, essayé d'en inventé un, en anglais, qui est assez évocateur.
Il faut définir le type des arguments dans l'entête de la fonction et dans la définition des paramètres.
Pour les fonctions récupérant un objet ou id en argument, on utilisera la fonctionnalité de findOneBy() intégré au framework. Celle-ci permet de gagner du temps lors du développement et de réduire le temps de compréhension des fonctions.
Pour utiliser cette fonctionnalité, il suffit de :
Ainsi, au lieu de
/** * Delete a User * * @Route("/SWFile/delete/{sw}", name="swfile_delete", requirements={"sw"="\d+"}) * * @param integer $id * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function delete(Integer $id) { $manager = $this->getDoctrine()->getManager(); //Récupération de l'utilisateur via l'id $user = $manager->getRepository(User::class)->findOneBy( array('id' => $id) ); //retrait du User $manager->remove($user); $manager->flush(); return $this->redirectToRoute('user'); }
On écrira :
/** * Delete a User * * @Route("/SWFile/delete/{sw}", name="swfile_delete", requirements={"sw"="\d+"}) * * @param User $user * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function delete(User $user) { $manager = $this->getDoctrine()->getManager(); //retrait du User, directement récupéré via l'appel automatique de findOneBy() par le framework $manager->remove($user); $manager->flush(); return $this->redirectToRoute('user'); }
Remarque : Les arguments passés à une méthode Symfony ne sont pas forcement des variables conventionnelles.
Exemple : La variable $mailer de type /SwiftMailer ou $request de type Request permettent d'accéder au contenu de la requête ou de définir le service de mail, nécessaire à l'envoi de mail.
/** * Edit a SWFile * * @Route("/SWFile/edit/{sw}", name="swfile_edit", requirements={"sw"="\d+"}) * * @IsGranted("ROLE_ADMIN", statusCode=404, message="Accès refusé !") * * @param Request $request * @param SWFile $SWFile * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function edit(Request $request, SWFile $SWFile){ ... }
Il existe plusieurs type de réponses de la part d'un contrôleur :
Pour retourner une vue, il suffit d'appeler la méthode $this→render()
/** * Display SWFile list in tab * * @Route("/SWFile/", name="swfile") * * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function index(Request $request) { $manager = $this->getDoctrine()->getManager(); $tabSWFile = $manager->getRepository(SWFile::class)->findAll(); return $this->render('SWFile/listSW.html.twig', array( 'tabSWFile' => $tabSWFile, )); }
Pour retourner un JSON, on créer un tableau et on retourne un objet JsonResponse.
use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; ... $modalBarge = $this->renderView('ajax:modalXXX.html.twig', array( 'tabBargesToday' => $tabBargesToday, 'tabBarges' => $tabBarges )); $json_array = array( 'error' => $error, 'modal' => $modalBarge ); $response = new JsonResponse(); return $response->setData($json_array);
Pour rediriger vers une méthode précise, on redirige vers la route associée à celle-ci via la méthode :
$this->redirectToRoute('swfile');
/** * Add a SWFile * * @Route("/ServiceWorker/add", name="swfile_add") * * @IsGranted("ROLE_ADMIN", statusCode=404, message="Accès réservé aux administrateurs !") * * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function add( Request $request ) { $SWFile = new SWFile(); $form = $this->createForm(SWFileType::class, $SWFile); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { ... //redirection vers la liste des swfiles après l'ajout return $this->redirectToRoute('swfile'); } ... }