dans mon projet Symfony à 3 maîtres, j'utilise ce code pour créer un formulaire dans un contrôleur:
$form = $this->createForm(ApplicantType::class, $applicant);
Maintenant, j'ai décidé de créer un service à partir de ce formulaire afin de pouvoir utiliser EntityManager à l'intérieur de celui-ci. Donc, dans Symfony2.x, ce serait assez simple, avec une déclaration dans services.yml et cette ligne de code:
$form = $this->createForm($this->get("applicant.form"), $applicant);
Cependant, cela n’est plus possible dans Symfony 3, car ce premier paramètre attend une chaîne, pas le formulaire lui-même.
Ma question est donc la suivante: comment créer un formulaire en tant que service dans Symfony 3 ou existe-t-il un autre moyen de transmettre EntityManager dans le formulaire?
Merci pour toute aide!
Définir un type de formulaire en tant que service n'implique pas de transmettre l'instance extraite du conteneur à createForm
. dans ce cas, le conteneur n'est pas impliqué dans la mesure où le composant de formulaire est impliqué.
Pour utiliser un type de formulaire enregistré en tant que service (avec la balise form.type
afin que le composant de formulaire le connaisse), il vous suffit de le référencer par son nom (c'est-à-dire le nom de classe qualifié complet dans Symfony 2.8+ et le nom de type dans les versions antérieures ) dans createForm
ou dans FormBuilder::add
. C’est exactement ce que vous faites pour les types de base Symfony btw (text
, choice
et ainsi de suite), qui sont enregistrés en tant que services. le code de votre contrôleur ne change du tout lorsque vous utilisez le type de formulaire en tant que service plutôt que d'avoir un type de formulaire sans dépendance et enregistré implicitement lors de la première utilisation.
C'est ce que j'ai fait pour injecter un formulaire sous forme de service dans Symfony 3 à partir de mon code Symfony 2.
Dans mon service.yml j'ai changé
issue.form:
class: Gutersohn\Bundle\CoreBundle\Form\IssueType
arguments: ['@service_container']
tags:
- { name: form.type, alias: issue }
à
issue.form:
class: Gutersohn\Bundle\CoreBundle\Form\IssueType
arguments: ['@service_container']
tags:
- { name: form.type }
Dans mon contrôleur j'ai changé
$form = $this->container->get('form.factory')->create($this->container->get('issue.form'), $issue, [
"method" => "post",
"action" => $this->container->get('router')->generate("ticket_add")
]);
à
$form = $this->container->get('form.factory')->create(IssueType::class, $issue, [
"method" => "post",
"action" => $this->container->get('router')->generate("ticket_add")
]);
Dans numéro # 17013 sur GitHub , aliemre a déclaré:
L'ajout d'une balise form.type suffit dans votre définition de service.
app.form.corporation_type: class: App\CorporationBundle\Form\CorporationType arguments: ["@doctrine.orm.entity_manager"] tags: - { name: form.type }
Le contrôleur doit rester le même:
$form = $this->createForm(CorporationType::class, $corporation);
J'ai testé et ça marche!