FormServiceProvider

El FormServiceProvider proporciona un servicio para construir formularios en tu aplicación con el componente Form de Symfony2.

Parámetros

  • form.secret: Este valor secreto se utiliza para generar y validar el fragmento CSRF para una página específica. Es muy importante para que ajustes este valor a un valor estático generado aleatoriamente, para impedir el secuestro de tus formularios. Por omisión es md5(__DIR__).

Servicios

Registrando

use Silex\Provider\FormServiceProvider;

$app->register(new FormServiceProvider());

Nota

Si no quieres crear tu propio diseño del formulario, está bien: se usará uno predefinido. Pero tendrás que registrar el proveedor de traducción como el diseño predefinido necesario para el formulario.

Si quieres usar validación en tus formularios, no olvides registrar el proveedor de validación.

Nota

El componente Form de Symfony y todas sus dependencias (opcionales o no) vienen con el archivo «gordo» de Silex pero no con el normal.

Si estás usando Composer, añádelo como dependencia en tu archivo composer.json:

"require": {
    "symfony/form": "2.1.*"
}

Si vas a usar la extensión de validación con formularios, también tienes que añadir una dependencia a los componentes symfony/config y symfony/translation:

"require": {
    "symfony/validator": "2.1.*",
    "symfony/config": "2.1.*",
    "symfony/translation": "2.1.*"
}

El componente Form de Symfony está basado en la extensión intl de PHP. Si no la tienes, puedes instalar el componente Locale de Symfony como un reemplazo:

"require": {
    "symfony/locale": "2.1.*"
}

Si quieres usar formularios en tus plantillas Twig, asegúrate de instalar el puente Twig de Symfony:

"require": {
    "symfony/twig-bridge": "2.1.*"
}

Uso

El FormServiceProvider proporciona un servicio form.factory. Aquí está un ejemplo de uso:

$app->match('/form', function (Request $request) use ($app) {
    // algún dato predefinido para cuando se muestra el formulario por primera vez
    $data = array(
        'name' => 'Your name',
        'email' => 'Your email',
    );

    $form = $app['form.factory']->createBuilder('form', $data)
        ->add('name')
        ->add('email')
        ->add('gender', 'choice', array(
            'choices' => array(1 => 'male', 2 => 'female'),
            'expanded' => true,
        ))
        ->getForm();

    if ('POST' == $request->getMethod()) {
        $form->bind($request);

        if ($form->isValid()) {
            $data = $form->getData();

            // hace algo con los datos

            // redirige a algún lugar
            return $app->redirect('...');
        }
    }

    // muestra el formulario
    return $app['twig']->render('index.twig', array('form' => $form->createView()));
});

Y aquí tienes la plantilla del formaulario index.twig (requiere symfony/twig- bridge):

<form action="#" method="post">
    {{ form_widget(form) }}

    <input type="submit" name="submit" />
</form>

Si estás usando el proveedor de validación, también puedes agregar validación a tu formulario añadiendo restricciones en los campos:

use Symfony\Component\Validator\Constraints as Assert;

$app->register(new Silex\Provider\ValidatorServiceProvider());
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
    'translator.messages' => array(),
));

$form = $app['form.factory']->createBuilder('form')
    ->add('name', 'text', array(
        'constraints' => array(new Assert\NotBlank(), new Assert\MinLength(5))
    ))
    ->add('email', 'text', array(
        'constraints' => new Assert\Email()
    ))
    ->add('gender', 'choice', array(
        'choices' => array(1 => 'male', 2 => 'female'),
        'expanded' => true,
        'constraints' => new Assert\Choice(array(1, 2)),
    ))
    ->getForm();

Puedes registrar las extensiones de form extendiendo de form.extensions:

$app['form.extensions'] = $app->share($app->extend('form.extensions', function ($extensions) use ($app) {
    $extensions[] = new YourTopFormExtension();

    return $extensions;
}));

Peculiaridades

Silex\Application\FormTrait añade los siguientes atajos:

  • form: Crea una instancia de FormBuilder.
$app->form($data);

Para más información, consulta la documentación de Formularios de Symfony2.

Bifúrcame en GitHub