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
Ouais normale qu'il n'y est rien en base, symfony2 n'est pas encore magique, ou alors je suis un pauvre moldue.
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
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