formulaire formFactory renvoye aucune donnée en base

Ce sujet est résolu
Default
,

Bonjour, j'ai créer un service qui me créer mon formulaire de Contact comme ci dessous:

services:
    form_contact.contact.form:
        factory_method: createNamed
        factory_service: form.factory
        class: Symfony\Component\Form\Form
        arguments:
            - form_contact # name of the form
            - contact_form # alias of the form type
            - null # data to bind, this is where your entity could go if you have that defined as a service
            - { validation_groups: [Default] } # validation groups
    form_contact.contact.form.type:
        class: Ecommerce\AdminBundle\Form\Type\ContactType
        tags:
        - { name: form.type, alias: contact_form }

Maintenant dans mon controller j'appel mon service:

$form = $this->get('form_contact.contact.form');


         if ($request->getMethod() == 'POST') {
              \var_dump($form->getData());exit;
         $this->get('session')->setFlash('notice', 'Merci de nous avoir contacté, nous répondrons à vos questions dans les plus brefs délais.');
}

Mais rien n'est renvoyer et rien en base

Une idée

Merci

2 Réponse

Default
,

Ouais normale qu'il n'y est rien en base, symfony2 n'est pas encore magique, ou alors je suis un pauvre moldue.

  • null # data to bind, this is where your entity could go if you have that defined as a servi
    Là c'est surement faux, il te faut une entity mappé en base, ou alors définir un mapped false et populé l'objet à la main.
    Je part du postulat que tu t'es trompé et que tu as une table contact avec l'entity Contact image de ta table contact

Autre chose, la factory pour les formulaires fournit par symfony2 n'est pas à utiliser en tant que service tel quel. Tu doit toi même surcharger leur factory, car là tu ne peut rien configurer (là tu en as une utilisation basique, mais tu verra que tu ne peut rien passer via les yml) Regarde FOSUserBundle, ils le font.

<?php 
$form = $this->get('form_contact.contact.form');
$contact = new Contact(); //Entity contact image de la table contact


    if ($request->getMethod() == 'POST' && $request->request->has($form->getName()) { //Best practices
        if($form->isValide){
            /**
                Les forms symfony2 fonctionne sur le principe de l'hydratation, ce fait $form->getData() === $Contact
                Il vient hydrater ton object $contact avec les nouvelles donnée à la volé grâce au setter & getter de ton entity
            **/
            //instanceof Doctrine\ORM\EntityManager
            /**
                Enregistre l'entity Contact dans le UnitOfWork courante
                Tant que tu ne flush pas, tu reste dans la UnitOfWork donc dans la transaction en cours.
                Tu peut donc persist n object au sein d'une UnitOfWork puis flush qui déclenchera le commit puis qui rollbackera l'ensemble des actions
                au seins de la trasancation si une erreur sauvage surgit. Sa évite que le début du block SQL soit enregistré en base alors que l'autre partie à échoué, 
                et de se retrouver avec des informations incohérentes.
                START TRANSACTION;
                INSERT CONTACT;
                INSERT N OBJECT
                COMMIT || ROLLBACK;
                Sa te permet de gérer l'intégrité des données, principe ACIDE
            **/
            $em->persist($contact); //Dans notre cas l'intégrité ne s'étend que sur l'object Contact, il n'y a pas d'autre action inhérente à l'ajout de contact en base
            $em->flush(); //Déclenche le commit
            $this->get('session')->setFlash('notice', 'Merci de nous avoir contacté, nous répondrons à vos questions dans les plus brefs délais.');
            /**
                On redirige toujours après un success de formulaire, car il si refresh celà va se ré enregistré en base à l'indentique. 
            **/
        return new RedirectResponse(/ **redirige vers cette même page ou ailleur** /);
        }else{
            $this->get('session')->setFlash('notice', 'Merci de nous avoir contacté, nous répondrons à vos questions dans les plus brefs délais.');
        }
    }
    //return la vue de ton controller
Default
,

Bonjour, mille excuses pour ne pas avoir répondu plus tôt, donc je te remercie pour ton et ta notice ci-dessus.

Merci encore