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 :

Instancier un objet et l'alimenter en fonction des réponses d'un formulaire [2.x]


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Instancier un objet et l'alimenter en fonction des réponses d'un formulaire
    Bonjour à tous,

    J'ai besoin de conseils sur des questions de méthodologie concernant les formulaires et relations entre entités. Je débute sur symfony2 évidemment

    J'ai un formulaire (QCM) avec un Type et un Handler (qui sont des services). Le formulaire est construit dans le Type, puis manipulé par le Handler. Pour l'instant je récupère, valid, persist et flush dans le handler via une méthode process(). Voici le controller pour comprendre un peu mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public function startAction(Request $request)
    {
        $formHandler = $this->get('test_handler');
     
        if ($formHandler->process()) {
            return $this->redirect($this->generateUrl('architest_front_test_result'));
        }
     
        return $this->render('ArchitestFrontBundle:Test:start.html.twig', array('form' => $formHandler->getForm()->createView()));
    }

    Je voudrais qu'à la récupération des réponses du form soit instancié un objet. Les valeurs des attributs de cet objet seraient calculées en fonction des réponses du formulaire. (Le but est que les réponses du QCM attribuent des points à chacun des attributs de cet objet).

    L'entité du formulaire est Test, et je veux la lier à l'entité Profil qui contiendrait les attributs.

    J'ai donc établi une relation OneToOne. Test est l'entité propriétaire, elle contient donc maintenant un attribut $profil.


    Très bien... Mais l'objet Profil n'est pas instancié.

    Je veux donc qu'une instance de Profil soit créée et alimentée dès que le formulaire est renvoyé par l'utilisateur.

    La solution que j'ai testé est de faire une méthode __construct() dans l'entité Test qui instancie l'objet Profil. C'est peut-être une hérésie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Entité Test sur laquelle est construit le formulaire
    public function __construct()
    {
        //Est-ce une hérésie ?
        $this->profil = new Profil();
    }
    Le bouquin et les tutos que je consulte donnent des exemples ou les deux objets sont instanciés dans le controller.
    $test = new Test();
    $profil = new Profil();
    Puis $test->setProfil($profil) pour lier les objets.
    Puis pour accéder aux méthodes de Profil : $test->getProfil()->setAttr1(3);

    C'est pas mal, même si moi j'ai déplacé la logique dans le Handler, je pourrais instancier Profil à cet endroit, mais pour éviter de vérifier toutes les réponses du form, j'aimerais que l'instanciation et l'alimentation de l'objet Profil soit automatique en fonction des réponses.
    Si j'instancie Profil dans la méthode __construct() de Test, je peux ensuite appeler les méthodes de Profil dans les setters de Test pour modifier les attributs de Profil ? (à moins que ce soit encore une hérésie

    Le but est d'arriver à ça :
    Question 3 du formulaire ---> Si réponse 'b' --> attribut2++ et attribut3-- de l'objet Profil.


    Merci, n'importe quel conseil m'aidera à mieux structurer mon code.

  2. #2
    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
    HUGH ! Que la paix soit avec toi !


    pour faire ça je schématise grossièrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    1:  $form->isValid() ?
    pour déterminer si ton formulaire est valide ou pas
     
    2: si valid,   $data = $form->getData();
    tu récupères les données reçus du formulaire
     
    3: tu analyses les données ($data) et implémente ta logique :
    Si réponse 'b' --> attribut2++ et attribut3-- de l'objet Profil.
    instanciation, persist .....


    est ce que cela réponds à ta question?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Merci !
    Dans mon cas c'est le Handler du formulaire qui s'occupe de $this->form->isValid();
    Je peux effectivement ensuite faire $this->form->getData();

    Donc tu me conseilles d'instancier l'objet Profil à cet endroit ? Puis de faire ma logique.
    Oui, c'est logique ensuite je persist et je flush l'ensemble.
    Je compte à terme séparer le travail du formulaire (testHandler.php), et le travail des entités (entityManager.php) donc je déplacerai tout ça dans entityManager.

    Alors c'est pas possible d'instancier un objet dans le construct de l'entité propriétaire ?
    De toute façon en y réfléchissant ça ne m'apporterait pas vraiment d'avantage.

  4. #4
    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 de mettre ton traitement dans un service qui lui va faire le traitement et les divers appels aux entitymanager ou repository.
    car l'action d'un contrôleur doit contenir un minimum de logique.(voir aucune)

    quant à ta dernière question , c'est de l'objet c'est possible. après à savoir si c'est mieux ou pas, je n'ai pas trop compris ton sujet pour te répondre.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Ok, merci !
    Je pense avoir respecté cette logique pour l'instant vu que mon controller est quasi vide (cf code posté).
    Par contre mon service form_handler (dans lequel j'ai injecté le form, la request et doctrine.orm.entity_manager) s'occupe à la fois de valider le formulaire et de manipuler les entités liées au formulaire. Selon mon tuto de video2brain, c'est un truc à ne pas faire. Un formHandler devrait uniquement s'occuper du formulaire (pas d'injection de doctrine.orm.entity_manager dans ce service). Il conseille de créer un entityManager pour gérer les manipulations d'entités ou les appels au repository.
    Bon après ça me paraît un peu complexe comme méthode, surtout vu ce que je fais !

    Merci pour ton aide !

    ps: C'est bon ça marche, reste à récupérer les données sur ma page d’arrivée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/04/2012, 07h13
  2. [XL-2003] Formulaire modulable en fonction des réponses
    Par tomo80 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/04/2011, 16h33
  3. [AC-2007] Insertion en fonction des champs d'un formulaire
    Par keuthi dans le forum VBA Access
    Réponses: 4
    Dernier message: 16/08/2010, 15h32
  4. Réponses: 5
    Dernier message: 08/05/2008, 21h44
  5. Changer d'image en fonction des options d'un formulaire
    Par Pouzy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/01/2006, 15h21

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