Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Cómo construir un formulario Symfony dinámicamente en un servicio

10 de junio de 2015

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

#1

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

10 junio 2015, 20:49
#2

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

10 junio 2015, 22:42
#3

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

11 junio 2015, 8:33
#4

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

11 junio 2015, 22:26