Symfony 3 – Definir la forma como un servicio

en mi proyecto Symfony 3-master, uso este código para crear un formulario en un controlador:

$form = $this->createForm(ApplicantType::class, $applicant); 

Ahora decidí hacer un servicio con este formulario, así que puedo usar EntityManager dentro de este. Entonces, en Symfony2.x, esto sería bastante fácil, solo con una statement en services.yml y esta línea de código:

 $form = $this->createForm($this->get("applicant.form"), $applicant); 

Sin embargo, esto ya no es posible en Symfony 3, porque este primer parámetro espera una cadena, no la propia forma.

Entonces mi pregunta es: ¿cómo creo un formulario como servicio en Symfony 3, o hay alguna otra forma de cómo pasar EntityManager dentro del formulario?

¡Gracias por cualquier ayuda!

Definir un tipo de formulario como servicio no implica pasar la instancia recuperada de a container a createForm . al hacer esto, el contenedor no está involucrado en lo que respecta al componente de forma.

Para usar un tipo de formulario registrado como servicio (con la etiqueta form.type para que el componente de formulario lo conozca), simplemente haga referencia a él por su nombre (es decir, el nombre de clase totalmente calificado en Symfony 2.8+ y el nombre de tipo en versiones anteriores) en createForm o en FormBuilder::add . Esto es exactamente lo que hace para los tipos de núcleo Symfony por cierto ( text , choice , etc.), que están registrados como servicios. el código de su controlador no cambia en absoluto cuando se utiliza el tipo de formulario como un servicio en lugar de tener un tipo de formulario sin dependencia y se registra implícitamente en el primer uso.

Esto es lo que hice para inyectar un formulario como servicio en Symfony 3 de mi código Symfony 2.

En mi servicio.yml cambié

 issue.form: class: Gutersohn\Bundle\CoreBundle\Form\IssueType arguments: ['@service_container'] tags: - { name: form.type, alias: issue } 

a

 issue.form: class: Gutersohn\Bundle\CoreBundle\Form\IssueType arguments: ['@service_container'] tags: - { name: form.type } 

En mi controlador, cambié

 $form = $this->container->get('form.factory')->create($this->container->get('issue.form'), $issue, [ "method" => "post", "action" => $this->container->get('router')->generate("ticket_add") ]); 

a

 $form = $this->container->get('form.factory')->create(IssueType::class, $issue, [ "method" => "post", "action" => $this->container->get('router')->generate("ticket_add") ]); 

En el número # 17013 en GitHub , aliemre declaró:

Agregar etiqueta form.type es suficiente en su definición de servicio.

 app.form.corporation_type: class: App\CorporationBundle\Form\CorporationType arguments: ["@doctrine.orm.entity_manager"] tags: - { name: form.type } 

El controlador debe permanecer igual:

 $form = $this->createForm(CorporationType::class, $corporation); 

¡He probado y funciona!

Intenté investigar el problema y profundizar en el cambio en github, que es este: https://github.com/symfony/symfony/commit/abca2d6fdc89479586e052cd11241d5a9bc885e5#diff-5c1348d69be32426ff20446c9e812365R64

Luego encontré el PR en Symfony que tiene esta eliminación de BC, decidí preguntar por qué el motivo y puedes verlo aquí: https://github.com/symfony/symfony/pull/16075#issuecomment-165106123

¡Espero que esto te ayude con el concepto al respecto!