Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Symfony Forms at Meetup Symfony Uruguay

Symfony Forms at Meetup Symfony Uruguay

Repaso del Form Component en la meetup de Symfony Uruguay del 28 de Octubre de 2015

Ismael Ambrosi

October 28, 2015
Tweet

More Decks by Ismael Ambrosi

Other Decks in Technology

Transcript

  1. Ismael Ambrosi @iambrosi Frontend Developer en VividCortex Co-organizador meetup PHPmvd

    Co-organizador meetup Symfony (Fanático de PHP) ¿Quién Soy?
  2. Permite crear, procesar y reutilizar formularios HTML “The Form component

    allows you to easily create, process and reuse HTML forms.”
  3. Form • Tienen un nombre • Tiene un tipo •

    Tienen datos • Se pueden anidar
  4. Formatos de datos • Formato del modelo (model format) •

    Formato de la vista (view format) • Formato normalizado (normalized format)
  5. Formatos de datos Model format Formato que existe en nuestro

    modelo. Ej: Tal cual querémos que sea persistido por nuestro ORM
  6. Formatos de datos View format Tal cual va a ser

    mostrado al usuario en los elementos de nuestra vista. Ej: Un objeto DateTime se transforma en un array("year" => 2013, "month" => 10, "day" => 12)
  7. Formatos de datos Normalized format Formato intermedio entre la vista

    y el modelo. Se recomienda que este formato guarde cuanta información sea posible.
  8. Form Types • Describen el formulario • Existen solamente una

    vez en la aplicación • Implementan Symfony\Component\Form\FormTypeInterface • Se pueden heredar • Pueden ser servicios • Symfony incorpora muchos types built-in
  9. Form Types namespace AppBundle\Form;
 
 use AppBundle\Entity\User;
 use Symfony\Component\Form\AbstractType;
 use

    Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolver;
 
 class UserType extends AbstractType
 {
 public function buildForm(FormBuilderInterface $builder, array $options)
 {
 $builder->add('name', 'text');
 $builder->add('email', 'email');
 $builder->add('password', 'password');
 }
 
 public function configureOptions(OptionsResolver $resolver)
 {
 $resolver->setDefault('data_class', User::class);
 }
 
 public function getName()
 {
 return 'user';
 }
 }
  10. Types built-in Text fields text textarea email integer money number

    password percent search url Choice fields choice entity country language locale timezone currency Date & Time date datetime time birthday Other fields checkbox radio file Group fields collection repeated Hidden fields hidden Button fields button submit reset
  11. Renderizado public function indexAction(Request $request)
 {
 $form = $this->createForm(new UserType(),

    null, [
 'method' => 'POST', // default: POST, PUT, DELETE, PATCH
 'action' => '/post'
 ]);
 
 return $this->render('default/index.html.twig', [
 'form' => $form->createView(),
 ]);
 } Creamos la vista del formulario para enviarla al template
  12. Renderizado <form action="/post" method="post"> {{ form_row(form.name) }} {{ form_row(form.email) }}

    {{ form_row(form.password) }} {{ form_rest(form) }} <button type="submit">Submit</button> </form> Mostrando cada elemento del formulario
  13. Renderizado <form action="/post" method="post"> {{ form_row(form.name) }} {{ form_row(form.email) }}

    {{ form_row(form.password) }} {{ form_rest(form) }} <button type="submit">Submit</button> </form> Mostrando cada elemento del formulario Muestra los elementos restantes
  14. Submit Validación Submit Bind Cada campo es procesado por el

    componente de validación y se asigna el error en caso de haberlo
  15. Submit Validación Mensaje de error Status 400 Submit Bind Error

    Envío de respuesta de error si el formulario no es válido
  16. Submit Validación Éxito Mensaje de error Status 400 Persistencia del

    modelo Mensaje de éxito Status 2xx Submit Bind Error Respuesta de éxito si el formulario es válido
  17. Submit public function postAction(Request $request)
 {
 $form = $this->createForm(new UserType(),

    $data, $options);
 
 $form->handleRequest($request);
 if (!$form->isValid()) {
 throw new BadRequestHttpException('Invalid form');
 }
 
 // Persistencia de datos
 
 return new Response('Success');
 }
  18. Submit public function postAction(Request $request)
 {
 $form = $this->createForm(new UserType(),

    $data, $options);
 
 $form->handleRequest($request);
 if (!$form->isValid()) {
 throw new BadRequestHttpException('Invalid form');
 }
 
 // Persistencia de datos
 
 return new Response('Success');
 } bind success error submit validación
  19. Submit public function postAction(Request $request)
 {
 $form = $this->createForm(new UserType(),

    $data, $options);
 
 $form->handleRequest($request);
 if (!$form->isValid()) {
 $this->render('default:index.html.twig', [
 'form' => $form->createView(),
 ]);
 }
 
 $manager = $this->getDoctrine()->getManager();
 $manager->persist($form->getData());
 $manager->flush();
 
 return $this->redirectToRoute('homepage');
 }
  20. Submit public function postAction(Request $request)
 {
 $form = $this->createForm(new UserType(),

    $data, $options);
 
 $form->handleRequest($request);
 if (!$form->isValid()) {
 $this->render('default:index.html.twig', [
 'form' => $form->createView(),
 ]);
 }
 
 $manager = $this->getDoctrine()->getManager();
 $manager->persist($form->getData());
 $manager->flush();
 
 return $this->redirectToRoute('homepage');
 } crea la instancia de User Retorna la entidad
  21. Eventos • Permiten construir el formulario basandose en los datos

    • Permiten construir el formulario basandose en el estado de la aplicación • Permiten configurar el modelo en base a los datos recibidos
  22. Eventos Eventos lanzados por el EventDispatcher • PRE_SET_DATA (form.pre_set_data) •

    POST_SET_DATA (form.post_set_data) • PRE_SUBMIT (form.pre_bind) • SUBMIT (form.bind) • POST_SUBMIT (form.post_bind)
  23. Eventos • Permite modificar los datos asignados al formulario desde

    nuestro modelo. • Permite modificar el formulario en base a los datos del modelo • Permite modificar el formulario en base al estado de mi aplicación PRE_SET_DATA
  24. Eventos PRE_SUBMIT Nos permite acceder y modificar los datos tal

    cual fueron enviados por el navegador en el submit.
  25. Eventos POST_SUBMIT Nos permite acceder a los datos de la

    vista y modificar los datos que ya fueron asignados al modelo.
  26. Resumen 1.Creamos el formulario basado en un tipo 2.Creamos la

    vista para ese formulario 3.Mostramos el template Vista
  27. Resumen •Creamos el formulario basado en un tipo •Enlazamos el

    $request •Validamos • Error • Mostramos el formulario indicando errores • Retornamos STATUS 400 • Éxito • Persistimos entidades • Mensaje de éxito (Ej: Redirección a un listado) Submit
  28. API if ('application/json' === $request->getContentType()) {
 $payload = $request->getContent();
 $data

    = json_decode($payload, true); 
 $request->request->add($data);
 } Pre-proceso de request JSON
  29. API public function postAction(Request $request)
 {
 $form = $this->createForm(new UserType(),

    $data, $options);
 
 $form->handleRequest($request);
 if (!$form->isValid()) {
 throw new BadRequestHttpException('Invalid form');
 }
 
 // Persistencia de datos
 
 return new Response('Success');
 }
  30. API public function postAction(Request $request)
 {
 $form = $this->createForm(new UserType(),

    $data, $options);
 
 $form->handleRequest($request);
 if (!$form->isValid()) {
 throw new BadRequestHttpException('Invalid form');
 }
 
 // Persistencia de datos
 
 return new Response('Success');
 } Atención a la respuesta de la acción
  31. Formularios + validación use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
 use Symfony\Component\Form\Forms;
 use Symfony\Component\Validator\Validation;
 


    // Instancia de Validator
 $validator = Validation::createValidator();
 
 $formFactory = Forms::createFormFactoryBuilder()
 // Agregamos la extensión
 ->addExtension(new ValidatorExtension($validator))
 ->getFormFactory();