IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[bonne pratique] utiliser Handler dans vos controleurs


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [bonne pratique] utiliser Handler dans vos controleurs
    Dans les bonnes pratiques, j'ai relevé le Handler qui nous permet de récupérer le formulaire, de le traiter tout ça hors contrôleur (comme le ferai un service mais mieux qu'un service car pas besoin de le déclarer dans config).

    l'exemple, récuperation d'information d'un form (mail, sujet, message) pour envoyer un email
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    <?php
    # src/tuto/WelcomeBundle/Form/Handler/ContactHandler.php
     
    namespace tuto\WelcomeBundle\Form\Handler;
     
    use Symfony\Component\Form\Form;
    use Symfony\Component\HttpFoundation\Request;
     
    /**
     * The ContactHandler.
     * Use for manage your form submitions
     *
     * @author Vincent Paulin
     */
    class ContactHandler
    {
        protected $request;
        protected $form;
        protected $mailer;
     
        /**
         * Initialize the handler with the form and the request
         *
         * @param Form $form
         * @param Request $request
         * @param $mailer
         * 
         */
        public function __construct(Form $form, Request $request, $mailer)
        {
            $this->form = $form;
            $this->request = $request;
            $this->mailer = $mailer;
        }
     
      /**
       * Process form
       *
       * @return boolean
       */
      public function process()
      {
          // Check the method
          if ('POST' == $this->request->getMethod())
          {
              // Bind value with form
              $this->form->bindRequest($this->request);
     
              $data = $this->form->getData();
              $this->onSuccess($data);
     
              return true;
          }
     
          return false;
      }
     
        /**
         * Send mail on success
         * 
         * @param array $data
         * 
         */
        protected function onSuccess($data)
        {
            $message = \Swift_Message::newInstance()
                        ->setContentType('text/html')
                        ->setSubject($data['subject'])
                        ->setFrom($data['email'])
                        ->setTo('xxxxxx@gmail.com')
                        ->setBody($data['content']);
     
            $this->mailer->send($message);
        }
    }

    dans le controleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     public function indexAction()
        {
            $form = $this->get('form.factory')->create(new ContactType());
     
             // Get the request
            $request = $this->get('request');
     
            // Get the handler
            $formHandler = new ContactHandler($form, $request, $this->get('mailer'));
     
            $process = $formHandler->process();
     
            if ($process)
            {
                // Launch the message flash
                $this->get('session')->setFlash('notice', 'Merci de nous avoir contacté, nous répondrons à vos questions dans les plus brefs délais.');
            }
    ....

    donc à vous, si vous avez de bonne pratique...

  2. #2
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Hello,

    Ça semble ok, tu pourrais laisser ça comme ça : c'est assez propre, ça n'encombre pas inutilement le contrôleur.
    Par contre :

    Dans les bonnes pratiques, j'ai relevé le Handler qui nous permet de récupérer le formulaire, de le traiter tout ça hors contrôleur (comme le ferai un service mais mieux qu'un service car pas besoin de le déclarer dans config).
    ... ta parenthèse est fausse sur plusieurs points :
    1) un handler n'est pas nécessairement différent d'un service : tu peux le déclarer en tant que tel.
    2) ce n'est pas nécessairement mieux de ne pas le déclarer comme un service : surtout si tu veux faire de la sauce "bonne pratique" et suivre un peu le fonctionnement de Symfony, un handler peut être injecté au contrôleur au même titre que n'importe quel service

    Si vraiment tu veux le confronter à une autre manière de faire tu peux par exemple injecter ce Handler au contrôleur, et tu peux également injecter le service requestStack au lieu de la requête (disponible à partir de la 2.4) et le service formFactory à ton formHandler de manière à avoir tout ce qu'il faut pour générer ton form à l'intérieur du handler. Ton contrôleur ressemblera alors juste à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ($this->formHandler->process())
    {
        // Launch the message flash
        $this->get('session')->setFlash('notice', 'Merci de nous avoir contacté, nous répondrons à vos questions dans les plus brefs délais.');
    }
    Ce n'est pas indispensable d'en arriver là, ta technique est déjà assez propre, mais c'est une autre manière de faire.

  3. #3
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    ok merci pour cs précisions.
    non non si tu vois d'autres manières montre nous avec des exemples.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Question, en utilisant un handler ?

    A qu'elle moment utilisez vous la validation des formulaires et comment retournez vous les éventuels erreurs ?

  5. #5
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Citation Envoyé par goabonga Voir le message
    Question, en utilisant un handler ?

    À quel moment utilisez-vous la validation des formulaires et comment retournez-vous les éventuelles erreurs ?
    Rien ne change de ce coté là, le relevé des erreurs de validation se fait toujours au moment ou tu bind l'entity au form : que tu fasses ça dans le contrôleur ou dans le formHandler (à l'intérieur de la méthode process)

    L'affichage des erreurs ne change pas non plus et peut se faire dans le twig depuis l'objet form rendu

    Que l'on utilise cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ form_widget(form) }}
    Ou celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ form_errors(form.field) }}

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Si je bind (handleRequest) et valide dans le handler, ce dernier devra connaitre Request, un FormType et le reste.
    Et en plus la function process retourne le form validé ou pas.
    Dans ce cas je ne vois vraiment pas ou est la "bonne pratique" ?




    (Merci NICO_F mais je sais afficher les erreurs d'un form avec ou sans twig)

  7. #7
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    la bonne pratique est que la classe handler est en dehors du controleur !

  8. #8
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Ce dernier devra connaitre Request, un FormType et le reste
    Exact : le form factory aussi.
    Je pense que ce n'est pas déconnant d'injecter le RequestStack au FormHandler puisqu'il va traiter les résultats contenus dans la requête.

    Et en plus la function process retourne le form validé ou pas.
    Dans son cas oui ... je n'y ai pas particulièrement fait attention.
    Personnellement je rajoute l'appel à une méthode de mon FormHandler "isSuccess()" après le process() me permettant de savoir si tout s'est bien passé ou non.

    La bonne pratique étant au final d'avoir tout le processus de la création jusqu'à la validation du formulaire dans une classe et d'alléger le contrôleur.
    Interface et|ou Abstract de toutes les méthodes redondantes à tous les formulaire et tu as un composant Form custom qui te simplifie la vie.

    (Merci NICO_F mais je sais afficher les erreurs d'un form avec ou sans twig)
    Tout plein d'excuses : je n'avais pas complètement compris la question

Discussions similaires

  1. [Bonnes Pratiques] Outils utilisés dans la gestion d'un projet informatique
    Par Babas007 dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 16/07/2014, 13h05
  2. [.NET] Bonne pratiques Utilisation des dataview
    Par gabouille dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 02/10/2013, 14h16
  3. Réponses: 3
    Dernier message: 24/09/2013, 17h34
  4. Bonnes pratiques de design : dans le code Java ou dans le CSS?
    Par Florent23 dans le forum GWT et Vaadin
    Réponses: 6
    Dernier message: 31/12/2010, 13h02
  5. Réponses: 5
    Dernier message: 02/07/2009, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo