Outils pour utilisateurs

Outils du site


symfony_4:fonctionnement:les_controleurs_preparation_des_donnees

Ceci est une ancienne révision du document !


Les contrôleurs

Définition

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.


Création

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

Les méthodes sont à ajouté manuellement.

Nommage

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 :

  • index (listing, page d'accueil, etc.)
  • add
  • edit
  • delete

Pour les autres, essayé d'en inventé un, en anglais, qui est assez évocateur.

Arguments

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 :

  • Définir un paramètre pour la route de la méthode,
  • Définir le paramètre avec l'entité devant
    • Exemple :
      • public function delete ( $id ) { … } devient
      • public function delete ( User $user ) { … }

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');
    }

Exemple

/**
     * 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){ ... }

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.

Retours

Il existe plusieurs type de réponses de la part d'un contrôleur :

  • Affichage d'une vue
  • Réponse en JSON (pour l'ajax, par exemple)
  • Re-direction vers une route spécifique
  • Un code HTML ( 200, 404, 500 )

Affichage d'une vue (TWIG)

Envoi en AJAX

Redirection vers une route

Code HTML

Exceptions

Flash message

Exemple

<?php
 
namespace App\Controller;
 
use App\Entity\SWFile;
use App\Form\SWFileType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
 
class SWFileController extends Controller
{
    /**
     * Display SWFile list in tab
     *
     * @Route("/SWFile/", name="swfile")
     * 
     * @IsGranted("ROLE_ADMIN", statusCode=404, message="Accès refusé !")
     * 
     * @param Request $request
     * @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,
        ));
    }
 
    /**
     * Add a SWFile
     *
     * @Route("/ServiceWorker/add", name="swfile_add")
     *
     * @IsGranted("ROLE_ADMIN", statusCode=404, message="Accès refusé !")
     *
     * @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()) {
            // $form->getData() holds the submitted values
            // but, the original `$task` variable has also been updated
            $SWFile = $form->getData();
 
            //MAJ des champs non disponibles sur le formulaire
            $SWFile->setCreationDate(new \DateTime("now") );
            $SWFile->setEditDate(new \DateTime("now") );
 
            //Application des modifs en BDD
            $manager = $this->getDoctrine()->getManager();
            $manager->persist($SWFile);
            $manager->flush();
 
            return $this->redirectToRoute('swfile_add');
        }
 
        return $this->render('SWFile/newSW.html.twig', array(
            'form' => $form->createView(),
        ));
    }
 
    /**
     * 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)
    {
        $form = $this->createForm(SWFileType::class, $SWFile);
 
        $form->handleRequest($request);
 
        if ($form->isSubmitted() && $form->isValid()) {
            // $form->getData() holds the submitted values
            // but, the original `$task` variable has also been updated
            $SWFile = $form->getData();
 
            //MAJ des champs non disponibles sur le formulaire
            $SWFile->setCreationDate(new \DateTime("now") );
            $SWFile->setEditDate(new \DateTime("now") );
 
            //Application des modifs en BDD
            $manager = $this->getDoctrine()->getManager();
            $manager->persist($SWFile);
            $manager->flush();
 
            return $this->redirectToRoute('swfile');
        }
 
        return $this->render('SWFile/newSW.html.twig', array(
            'form' => $form->createView(),
        ));
    }
 
    /**
     * Delete a SWFile (not the file, just the database slot
     *
     * @Route("/SWFile/delete/{sw}", name="swfile_delete", 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 delete(Request $request, SWFile $SWFile)
    {
        $manager = $this->getDoctrine()->getManager();
 
        //retrait du SWFile
        $manager->remove($SWFile);
        $manager->flush();
 
        return $this->redirectToRoute('swfile');
    }
 
}
symfony_4/fonctionnement/les_controleurs_preparation_des_donnees.1539934704.txt.gz · Dernière modification: 2019/12/08 08:43 (modification externe)