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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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
    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 Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    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 extrêmement actif
    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
    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 expérimenté
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    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 Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    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 expérimenté
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    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)

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