Hola, un saludo a tod@s. Nuevamente por acá...
Tengo una duda. ¿Se puede en Symfony crear formularios en un servicio y renderizarlo? No crearlo como servicio. O mejor, ¿alguien sabe cuál es el @id
del FormBuilder para inyectarlo en mi servicio y poder crearlo desde allí?
Hacer algo como:
# Servicio mi.servicio: class: Bundle\Servicios\Servicio arguments: [@form.builder]
Servicio:
public function __construct(FormBuilder $b) { $this->b = $b; }
Quedo atento. Saludos cordiales.
Respuestas
En estos casos lo mejor es fijarse en el controlador base que proporciona el framework Symfony. Si ves su código fuente, verás cómo funcionan en realidad los atajos tipo $this->render()
o $this->createFormBuilder()
.
De hecho, el código fuente del método createFormBuilder() te da la pista del servicio que debes utilizar:
protected function createFormBuilder($data = null, array $options = array()) { return $this->container->get('form.factory')->createBuilder('form', $data, $options); }
Así que tu archivo de configuración quedaría:
mi.servicio: class: Bundle\Servicios\Servicio arguments: [@form.factory]
@javiereguiluz
Gracias Javier por la respuesta.
Estoy haciendo lo que me indicas. Y supongo que para acceder a los valores del Controller (Symfony\Bundle\FrameworkBundle\Controller\Controller
) debo extender mi Servicio de Controller. Pero, al querer recuperar algo como $this->createForm(...)
me arroja lo siguiente:
Error: Call to a member function get() on null.
Lo que hice para poder crear y renderizar el formulario desde el servicio fue instanciar la clase Symfony\Component\Form\Forms
así:
// ... use Symfony\Component\Form\Forms; $formFactory = Forms::createFormFactory(); $form = $formFactory->createBuilder(new Type(), $entity)->getForm();
La duda que me queda es cómo capturar esta información de la manera que me dices: $this->get()
, $this->createForm()
y no me arroje el error.
Saludos!
@cristian_angulo
No entiendo por qué haces esto: $formFactory = Forms::createFormFactory();
. Si inyectas el servicio @form.factory
como te indiqué, en tu código PHP simplemente puedes hacer:
$this->formFactory->createBuilder(new Type(), $entity)->getForm());
Luego si quieres renderizarlo, sólo tienes que inyectar también el servicio templating
y hacer lo siguiente:
$codigoHtml = $this->templating->render('nombre_plantilla.html.twig', array( 'form' => $form->createView() ));
@javiereguiluz
Javier, lo hice de esa manera porque al inyectar el @form.factory
me arrojó el error Error: Call to a member function get() on null
. Así, fue la única manera de que me funcionó el crear los formularios. Sí me parece raro porque tengo varios servicios inyectados y todos me funcionaron bien.
arguments: [@doctrine.orm.entity_manager, @twig, @app.mensajero, @router, @security.context]
Saludos y gracias. Voy a revisar nuevamente!
@cristian_angulo