El FormServiceProvider proporciona un servicio para construir formularios en tu aplicación con el componente Form de Symfony2.
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.*"
}
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;
}));
Silex\Application\FormTrait añade los siguientes atajos:
$app->form($data);
Para más información, consulta la documentación de Formularios de Symfony2.