SlideShare una empresa de Scribd logo
1 de 62
Formularios y REST
deSymfony 2013
Moisés Gallego
deSymfony 2013Formularios y REST 4 / 62
@moisesgallego
deSymfony 2013Formularios y REST
github.com/mgallego
5 / 62
deSymfony 2013Formularios y REST 6 / 62
deSymfony 2013Formularios y REST
● Web: symfony-madrid.es
● Twitter: @symfony_madrid
● Comunidad G+: Symfony Madrid
● Youtube: youtube.com/symfonymadrid
● Lista de correo: groups.google.com/group/symfony_madrid
7 / 62
deSymfony 2013Formularios y REST
WE WANT YOU!WE WANT YOU!
● Web: symfony-madrid.es
● Twitter: @symfony_madrid
● Comunidad G+: Symfony Madrid
● Youtube: youtube.com/symfonymadrid
● Lista de correo: groups.google.com/group/symfony_madrid
8 / 62
¿Qué vamos a ver?
Breve introducción a REST
Cómo montar uno con Symfony2
FOSRestBundle
Uso de formularios en REST
Ejemplos de código
deSymfony 2013Formularios y REST 9 / 62
¿Qué es REST?
deSymfony 2013Formularios y REST 10 / 62
¿Qué es REST?
“Architectural Styles and the Design of Network-
based Software Architectures” and describes a series
of constraints that exemplify how the web’s design
emerged utilizing the Hyper Text Transfer Protocol.”
by Roy Fielding’s Doctoral Thesis
deSymfony 2013Formularios y REST 11 / 62
¿Qué es REST?
● Protocolo cliente/servidor sin estado
● Operaciones POST, PUT, GET y DELETE
● Sintaxis universal
● Hipermedios (HATEOAS)
deSymfony 2013Formularios y REST 12 / 62
¿Qué es REST?
deSymfony 2013Formularios y REST 13 / 62
HATEOAS
(Hypermedia as the Engine of Application State)
{
nombre: 'Moises',
apellido: 'Gallego',
…..
direccion: {
calle: 'falsa',
numero: 123,
Uri: '/api/v1/addesses/1'
}
}
Charlie don't code
(http://charliedontcode.com/rest/2012/09/27/rest-apis-hateoas.html)
REST en Symfony2
deSymfony 2013Formularios y REST
El Método Artesanal
14 / 62
REST en Symfony2
El método Artesanal
REQUEST
Creación de rutas y métodos apropiados con el
Router de Symfony2
Sintaxis Universal
methods:
[GET, PUT, POST, DELETE]
deSymfony 2013Formularios y REST 15 / 62
REST en Symfony2
El método Artesanal
Ejemplo GET
get_resources:
path: /api/v1/resources
defaults: { _controller: AcmeDemoBundle:Main:getResources }
methods: [GET]
Ejemplo POST
post_resources:
path: /api/v1/resources
defaults: { _controller: AcmeDemoBundle:Main:postResources }
methods: [POST]
deSymfony 2013Formularios y REST 16 / 62
REST en Symfony2
El método Artesanal
CONTROLADOR HTTP
Deserialización del Request
Manejar cabeceras
HTTP Status Codes
deSymfony 2013Formularios y REST 17 / 62
REST en Symfony2
El método Artesanal
CONTROLADOR
Adaptamos la petición que recibimos cliente
Lógica de negocio
Manejar errores
Crear una vista
Pasar el modelo a la vista
deSymfony 2013Formularios y REST 18 / 62
REST en Symfony2
El método Artesanal
deSymfony 2013Formularios y REST 19 / 62
REST en Symfony2
El método Artesanal
deSymfony 2013Formularios y REST 20 / 62
REST en Symfony2
El método Artesanal
deSymfony 2013Formularios y REST 21 / 62
REST en Symfony2
El método Artesanal
deSymfony 2013Formularios y REST
Symfony REST and RAD
http://www.beberlei.de/talks/symfony-rest
22 / 62
REST en Symfony2
deSymfony 2013Formularios y REST
El camino de
baldosas amarillas
23 / 62
FOSRestBundle
deSymfony 2013Formularios y REST 24 / 62
FOSRestBundle
¿Qué ofrece?
●Capa de vista con formato agnóstico de salida
●Cargador de rutas adaptado
●Decodificación de peticiones HTTP y Accept Headers
●Control de excepciones a través de códigos de estado HTTP
●...
deSymfony 2013Formularios y REST 25 / 62
FOSRestBundle
REQUEST
Métodos a través de anotaciones
FOSRestBundleControllerAnnotationsGet
FOSRestBundleControllerAnnotationsPost
FOSRestBundleControllerAnnotationsPut
FOSRestBundleControllerAnnotationsDelete
deSymfony 2013Formularios y REST 26 / 62
Ejemplo
/**
* Lists resources.
*
* @Get("api/v1/public/resource/{id}")
*/
public function getResourceAction($id)
{
….
}
deSymfony 2013Formularios y REST
FOSRestBundle
REQUEST
FOSRestBundle
REQUEST
27 / 62
Decodificación de peticiones HTTP
@ParamFetcher
(FOSRestBundleRequestParamFetcher)
@QueryParam
(FOSRestBundleControllerAnnotationsQueryParam)
deSymfony 2013Formularios y REST
FOSRestBundle
REQUEST
28 / 62
Ejemplo ParamFetcher
/**
* Lists resources.
*
* @param ParamFetcher $paramFetcher
*/
public function getResourceAction(ParamFetcher $paramFetcher)
{
$page = $paramFetcher->get('page');
….
}
deSymfony 2013Formularios y REST
FOSRestBundle
REQUEST
FOSRestBundle
REQUEST
29 / 62
Ejemplo QueryParam
/**
* Lists resources.
*
* @QueryParam(name="page", requirements="d+", default="1",
description="Page of the overview.")
*/
public function getResourceAction($page)
{
….
}
deSymfony 2013Formularios y REST
FOSRestBundle
REQUEST
FOSRestBundle
REQUEST
30 / 62
Podemos crear acciones en los controladores del tipo
getRecursoAction, postRecursoAction, etc y
automáticamente FOSRestBundle genera los métodos
y rutas e incluso crea automáticamente los plurales.
deSymfony 2013Formularios y REST
FOSRestBundle
Un poquito de magia
31 / 62
<?php
class UsersController
{
public function getUserAction($slug)
{} // "get_user" [GET] /users/{slug}
public function getUsersAction()
{} // "get_users" [GET] /users
public function postUsersAction()
{} // "post_users" [POST] /users
public function patchUsersAction()
{} // "patch_users" [PATCH] /users
deSymfony 2013Formularios y REST
FOSRestBundle
Un poquito de magia
32 / 62
Con una anotación del tipo
@RouteResource(“Recurso”) en el controlador
podemos crear acciones llamadas getAction,
postAction, etc y él se encarga de el resto
deSymfony 2013Formularios y REST
FOSRestBundle
Un poquito de magia
33 / 62
/**
* @RouteResource("User")
*/
class FooController
{
public function cgetAction()
{} // "get_users" [GET] /users
public function newAction()
{} // "new_users" [GET] /users/new
public function getAction($slug)
{} // "get_user" [GET] /users/{slug}
..
public function getCommentsAction($slug)
{} // "get_user_comments" [GET] /users/{slug}/comments
..
}
deSymfony 2013Formularios y REST
FOSRestBundle
Un poquito de magia
34 / 62
Mas sencillo aún que el Request
Creamos una vista
$view = FOSView::create();
La devolvemos
return $view->setStatusCode(Codes::HTTP_OK)->setData($data);
deSymfony 2013Formularios y REST
FOSRestBundle
RESPONSE
35 / 62
Ejemplo
public function getResourceAction($id)
{
$view = FOSView::create();
...
//cargamos una variable $data por ejemplo con Doctrine
$data = $em->getRepository('...Repository')
->findOneById($id);
...
return $view->setStatusCode(200)->setData($data);
}
deSymfony 2013Formularios y REST
FOSRestBundle
RESPONSE
36 / 62
JMSSerializerBundle
NelmioApiDocBundle
FSCHateoasBundle
Hautelook/TemplateUriBundle
deSymfony 2013Formularios y REST
Otros Bundles de utilidad
37 / 62
¿Y cómo tratamos lo que
recibimos por POST y PUT?
deSymfony 2013Formularios y REST
Formularios
38 / 62
Formularios
¿Que ventajas aportan?
Podemos usarlos como recursos e incluso subrecursos.
La carga de datos del request al modelo es automática a
través de los métodos Bind que implementa.
Simplifica el uso de validadores.
DataTransformers.
Uso parecido en el lado cliente
Eventos
deSymfony 2013Formularios y REST 39 / 62
●FormType
●FormHandler
●FormModel
Formularios al límite [deSymfony2012]
(http://desymfony.com/ponencia/2012/formularios)
Formularios
¿Cómo trabajamos?
deSymfony 2013Formularios y REST 40 / 62
Formularios
deSymfony 2013Formularios y REST
Flujo de trabajo en lado
servidor
41 / 62
Obtenemos el Request
public function postUsersAction(Request $request)
{
$view = FOSView::create();
$data = $request->request->all();
…
}
Formularios
Servidor
deSymfony 2013Formularios y REST 42 / 62
Adaptamos el Request
class RequestToNewDataTransformer
{
public static function transform(array $array, ...)
{
//Realizamos la transformación de los datos
return $newArray;
}
}
Formularios
Servidor
deSymfony 2013Formularios y REST 43 / 62
Adaptamos el Request
public function postUsersAction(Request $request)
{
$view = FOSView::create();
$data = $this->reMap(
$request->request->all(),
…
);
...
}
Formularios
Servidor
deSymfony 2013Formularios y REST 44 / 62
Creamos el formulario
Y lo validamos
public function postUsersAction(Request $request)
{
$view = FOSView::create();
…
$form = $this->createForm(
new $formType(),
$resource,
['validation_groups' => ['Create', 'Default']]
);
}
Formularios
Servidor
deSymfony 2013Formularios y REST 45 / 62
¡Ojo!
El Required del FormType no hace una
validación real, solo se usa para realizar una
validación a través de HTML5, pero no en el
lado del servidor.
Formularios
Servidor
deSymfony 2013Formularios y REST 46 / 62
Procesamos el formulario
Y devolvemos la vista
public function postUsersAction(Request $request)
{
$view = FOSView::create();
…
$formHandler = new ResourceFormHandler($form, $data);
if ($formHandler->process()) {
return $view->setStatusCode(Codes::HTTP_CREATED);
}
return $view->setStatusCode(Codes::HTTP_BAD_REQUEST)
->setData($formHandler->serializeFormErrors());
}
Formularios
Servidor
deSymfony 2013Formularios y REST 47 / 62
Formularios
deSymfony 2013Formularios y REST
Flujo de trabajo en lado
cliente
48 / 62
Formularios
Cliente
El formulario se trata como un formulario normal de
Symfony2.
A la hora de enviarlo a la API lo convertimos a un array.
$modelFormClass->ToArray().
Guzzle para comunicación.
deSymfony 2013Formularios y REST 49 / 62
Casos Reales
deSymfony 2013Formularios y REST
Show me the code!
Uso de eventos para realizar un PATCH
deSymfony 2013Formularios y REST 51 / 62
Uso de eventos para realizar un PATCH
deSymfony 2013Formularios y REST 52 / 62
Envío y tratamiento de imágenes
CLIENTE
deSymfony 2013Formularios y REST 53 / 62
Envío y tratamiento de imágenes
SERVIDOR
deSymfony 2013Formularios y REST 54 / 62
Envío y tratamiento de imágenes
SERVIDOR
deSymfony 2013Formularios y REST 55 / 62
Envío y tratamiento de imágenes
SERVIDOR
deSymfony 2013Formularios y REST 56 / 62
Envío y tratamiento de imágenes
SERVIDOR
deSymfony 2013Formularios y REST 57 / 62
Envío y tratamiento de imágenes
CLIENTE
deSymfony 2013Formularios y REST 58 / 62
Envío y tratamiento de imágenes
CLIENTE
deSymfony 2013Formularios y REST 59 / 62
Conclusión
deSymfony 2013Formularios y REST 60 / 62
¿Preguntas?
deSymfony 2013Formularios y REST
¡Gracias!
61 / 62
Gracias
deSymfony 2013Formularios y REST
Twitter: @moisesgallego
Slideshare: http://www.slideshare.net/moisesgallego
¿Qué te ha parecido?
Joind.in: https://joind.in/talk/view/8838
62 / 62

Más contenido relacionado

Similar a Formularios y REST (deSymfony2013)

Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controllerhydras_cs
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosJavier Eguiluz
 
Symfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y MigraciónSymfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y MigraciónRodrigo Miranda
 
WordPress como back-end de nuestras apps
WordPress como back-end de nuestras appsWordPress como back-end de nuestras apps
WordPress como back-end de nuestras appsJaime Fernández
 
Desarrollo de Aplicaciones Web con Symfony 5/10/2011
Desarrollo de Aplicaciones Web con Symfony 5/10/2011Desarrollo de Aplicaciones Web con Symfony 5/10/2011
Desarrollo de Aplicaciones Web con Symfony 5/10/2011gorolabs
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Ricard Luquero
 
Silex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPSilex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPJavier Eguiluz
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2Mario IC
 
Taller Testing en Grails con Grails y Geb (WebDriver) - Springio I/O 2011
Taller Testing en Grails con Grails y Geb (WebDriver) - Springio I/O 2011Taller Testing en Grails con Grails y Geb (WebDriver) - Springio I/O 2011
Taller Testing en Grails con Grails y Geb (WebDriver) - Springio I/O 2011Fátima Casaú Pérez
 
Introducción a AngularJS
Introducción a AngularJS Introducción a AngularJS
Introducción a AngularJS Marcos Reynoso
 
Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)Javier Eguiluz
 
Presentacion
PresentacionPresentacion
PresentacionEl Jota
 

Similar a Formularios y REST (deSymfony2013) (20)

Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controller
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
 
Backend (sf2Vigo)
Backend (sf2Vigo)Backend (sf2Vigo)
Backend (sf2Vigo)
 
Symfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y MigraciónSymfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y Migración
 
Symfony parte 6
Symfony parte 6Symfony parte 6
Symfony parte 6
 
Cómo domar SonataAdminBundle
Cómo domar SonataAdminBundleCómo domar SonataAdminBundle
Cómo domar SonataAdminBundle
 
Servicios web
Servicios webServicios web
Servicios web
 
Hands on Spring 2.5
Hands on Spring 2.5Hands on Spring 2.5
Hands on Spring 2.5
 
WordPress como back-end de nuestras apps
WordPress como back-end de nuestras appsWordPress como back-end de nuestras apps
WordPress como back-end de nuestras apps
 
Desarrollo de Aplicaciones Web con Symfony 5/10/2011
Desarrollo de Aplicaciones Web con Symfony 5/10/2011Desarrollo de Aplicaciones Web con Symfony 5/10/2011
Desarrollo de Aplicaciones Web con Symfony 5/10/2011
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!
 
Silex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPSilex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHP
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
 
Taller Testing en Grails con Grails y Geb (WebDriver) - Springio I/O 2011
Taller Testing en Grails con Grails y Geb (WebDriver) - Springio I/O 2011Taller Testing en Grails con Grails y Geb (WebDriver) - Springio I/O 2011
Taller Testing en Grails con Grails y Geb (WebDriver) - Springio I/O 2011
 
Introducción a AngularJS
Introducción a AngularJS Introducción a AngularJS
Introducción a AngularJS
 
Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)
 
Symfony Parte 2
Symfony Parte 2Symfony Parte 2
Symfony Parte 2
 
Cien usos con serverless
Cien usos con serverlessCien usos con serverless
Cien usos con serverless
 
Xamarin Forms y MVVM
Xamarin Forms y MVVMXamarin Forms y MVVM
Xamarin Forms y MVVM
 
Presentacion
PresentacionPresentacion
Presentacion
 

Último

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 

Último (10)

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 

Formularios y REST (deSymfony2013)

  • 1.
  • 2.
  • 3. Formularios y REST deSymfony 2013 Moisés Gallego
  • 5. @moisesgallego deSymfony 2013Formularios y REST github.com/mgallego 5 / 62
  • 7. deSymfony 2013Formularios y REST ● Web: symfony-madrid.es ● Twitter: @symfony_madrid ● Comunidad G+: Symfony Madrid ● Youtube: youtube.com/symfonymadrid ● Lista de correo: groups.google.com/group/symfony_madrid 7 / 62
  • 8. deSymfony 2013Formularios y REST WE WANT YOU!WE WANT YOU! ● Web: symfony-madrid.es ● Twitter: @symfony_madrid ● Comunidad G+: Symfony Madrid ● Youtube: youtube.com/symfonymadrid ● Lista de correo: groups.google.com/group/symfony_madrid 8 / 62
  • 9. ¿Qué vamos a ver? Breve introducción a REST Cómo montar uno con Symfony2 FOSRestBundle Uso de formularios en REST Ejemplos de código deSymfony 2013Formularios y REST 9 / 62
  • 10. ¿Qué es REST? deSymfony 2013Formularios y REST 10 / 62
  • 11. ¿Qué es REST? “Architectural Styles and the Design of Network- based Software Architectures” and describes a series of constraints that exemplify how the web’s design emerged utilizing the Hyper Text Transfer Protocol.” by Roy Fielding’s Doctoral Thesis deSymfony 2013Formularios y REST 11 / 62
  • 12. ¿Qué es REST? ● Protocolo cliente/servidor sin estado ● Operaciones POST, PUT, GET y DELETE ● Sintaxis universal ● Hipermedios (HATEOAS) deSymfony 2013Formularios y REST 12 / 62
  • 13. ¿Qué es REST? deSymfony 2013Formularios y REST 13 / 62 HATEOAS (Hypermedia as the Engine of Application State) { nombre: 'Moises', apellido: 'Gallego', ….. direccion: { calle: 'falsa', numero: 123, Uri: '/api/v1/addesses/1' } } Charlie don't code (http://charliedontcode.com/rest/2012/09/27/rest-apis-hateoas.html)
  • 14. REST en Symfony2 deSymfony 2013Formularios y REST El Método Artesanal 14 / 62
  • 15. REST en Symfony2 El método Artesanal REQUEST Creación de rutas y métodos apropiados con el Router de Symfony2 Sintaxis Universal methods: [GET, PUT, POST, DELETE] deSymfony 2013Formularios y REST 15 / 62
  • 16. REST en Symfony2 El método Artesanal Ejemplo GET get_resources: path: /api/v1/resources defaults: { _controller: AcmeDemoBundle:Main:getResources } methods: [GET] Ejemplo POST post_resources: path: /api/v1/resources defaults: { _controller: AcmeDemoBundle:Main:postResources } methods: [POST] deSymfony 2013Formularios y REST 16 / 62
  • 17. REST en Symfony2 El método Artesanal CONTROLADOR HTTP Deserialización del Request Manejar cabeceras HTTP Status Codes deSymfony 2013Formularios y REST 17 / 62
  • 18. REST en Symfony2 El método Artesanal CONTROLADOR Adaptamos la petición que recibimos cliente Lógica de negocio Manejar errores Crear una vista Pasar el modelo a la vista deSymfony 2013Formularios y REST 18 / 62
  • 19. REST en Symfony2 El método Artesanal deSymfony 2013Formularios y REST 19 / 62
  • 20. REST en Symfony2 El método Artesanal deSymfony 2013Formularios y REST 20 / 62
  • 21. REST en Symfony2 El método Artesanal deSymfony 2013Formularios y REST 21 / 62
  • 22. REST en Symfony2 El método Artesanal deSymfony 2013Formularios y REST Symfony REST and RAD http://www.beberlei.de/talks/symfony-rest 22 / 62
  • 23. REST en Symfony2 deSymfony 2013Formularios y REST El camino de baldosas amarillas 23 / 62
  • 25. FOSRestBundle ¿Qué ofrece? ●Capa de vista con formato agnóstico de salida ●Cargador de rutas adaptado ●Decodificación de peticiones HTTP y Accept Headers ●Control de excepciones a través de códigos de estado HTTP ●... deSymfony 2013Formularios y REST 25 / 62
  • 26. FOSRestBundle REQUEST Métodos a través de anotaciones FOSRestBundleControllerAnnotationsGet FOSRestBundleControllerAnnotationsPost FOSRestBundleControllerAnnotationsPut FOSRestBundleControllerAnnotationsDelete deSymfony 2013Formularios y REST 26 / 62
  • 27. Ejemplo /** * Lists resources. * * @Get("api/v1/public/resource/{id}") */ public function getResourceAction($id) { …. } deSymfony 2013Formularios y REST FOSRestBundle REQUEST FOSRestBundle REQUEST 27 / 62
  • 28. Decodificación de peticiones HTTP @ParamFetcher (FOSRestBundleRequestParamFetcher) @QueryParam (FOSRestBundleControllerAnnotationsQueryParam) deSymfony 2013Formularios y REST FOSRestBundle REQUEST 28 / 62
  • 29. Ejemplo ParamFetcher /** * Lists resources. * * @param ParamFetcher $paramFetcher */ public function getResourceAction(ParamFetcher $paramFetcher) { $page = $paramFetcher->get('page'); …. } deSymfony 2013Formularios y REST FOSRestBundle REQUEST FOSRestBundle REQUEST 29 / 62
  • 30. Ejemplo QueryParam /** * Lists resources. * * @QueryParam(name="page", requirements="d+", default="1", description="Page of the overview.") */ public function getResourceAction($page) { …. } deSymfony 2013Formularios y REST FOSRestBundle REQUEST FOSRestBundle REQUEST 30 / 62
  • 31. Podemos crear acciones en los controladores del tipo getRecursoAction, postRecursoAction, etc y automáticamente FOSRestBundle genera los métodos y rutas e incluso crea automáticamente los plurales. deSymfony 2013Formularios y REST FOSRestBundle Un poquito de magia 31 / 62
  • 32. <?php class UsersController { public function getUserAction($slug) {} // "get_user" [GET] /users/{slug} public function getUsersAction() {} // "get_users" [GET] /users public function postUsersAction() {} // "post_users" [POST] /users public function patchUsersAction() {} // "patch_users" [PATCH] /users deSymfony 2013Formularios y REST FOSRestBundle Un poquito de magia 32 / 62
  • 33. Con una anotación del tipo @RouteResource(“Recurso”) en el controlador podemos crear acciones llamadas getAction, postAction, etc y él se encarga de el resto deSymfony 2013Formularios y REST FOSRestBundle Un poquito de magia 33 / 62
  • 34. /** * @RouteResource("User") */ class FooController { public function cgetAction() {} // "get_users" [GET] /users public function newAction() {} // "new_users" [GET] /users/new public function getAction($slug) {} // "get_user" [GET] /users/{slug} .. public function getCommentsAction($slug) {} // "get_user_comments" [GET] /users/{slug}/comments .. } deSymfony 2013Formularios y REST FOSRestBundle Un poquito de magia 34 / 62
  • 35. Mas sencillo aún que el Request Creamos una vista $view = FOSView::create(); La devolvemos return $view->setStatusCode(Codes::HTTP_OK)->setData($data); deSymfony 2013Formularios y REST FOSRestBundle RESPONSE 35 / 62
  • 36. Ejemplo public function getResourceAction($id) { $view = FOSView::create(); ... //cargamos una variable $data por ejemplo con Doctrine $data = $em->getRepository('...Repository') ->findOneById($id); ... return $view->setStatusCode(200)->setData($data); } deSymfony 2013Formularios y REST FOSRestBundle RESPONSE 36 / 62
  • 38. ¿Y cómo tratamos lo que recibimos por POST y PUT? deSymfony 2013Formularios y REST Formularios 38 / 62
  • 39. Formularios ¿Que ventajas aportan? Podemos usarlos como recursos e incluso subrecursos. La carga de datos del request al modelo es automática a través de los métodos Bind que implementa. Simplifica el uso de validadores. DataTransformers. Uso parecido en el lado cliente Eventos deSymfony 2013Formularios y REST 39 / 62
  • 40. ●FormType ●FormHandler ●FormModel Formularios al límite [deSymfony2012] (http://desymfony.com/ponencia/2012/formularios) Formularios ¿Cómo trabajamos? deSymfony 2013Formularios y REST 40 / 62
  • 41. Formularios deSymfony 2013Formularios y REST Flujo de trabajo en lado servidor 41 / 62
  • 42. Obtenemos el Request public function postUsersAction(Request $request) { $view = FOSView::create(); $data = $request->request->all(); … } Formularios Servidor deSymfony 2013Formularios y REST 42 / 62
  • 43. Adaptamos el Request class RequestToNewDataTransformer { public static function transform(array $array, ...) { //Realizamos la transformación de los datos return $newArray; } } Formularios Servidor deSymfony 2013Formularios y REST 43 / 62
  • 44. Adaptamos el Request public function postUsersAction(Request $request) { $view = FOSView::create(); $data = $this->reMap( $request->request->all(), … ); ... } Formularios Servidor deSymfony 2013Formularios y REST 44 / 62
  • 45. Creamos el formulario Y lo validamos public function postUsersAction(Request $request) { $view = FOSView::create(); … $form = $this->createForm( new $formType(), $resource, ['validation_groups' => ['Create', 'Default']] ); } Formularios Servidor deSymfony 2013Formularios y REST 45 / 62
  • 46. ¡Ojo! El Required del FormType no hace una validación real, solo se usa para realizar una validación a través de HTML5, pero no en el lado del servidor. Formularios Servidor deSymfony 2013Formularios y REST 46 / 62
  • 47. Procesamos el formulario Y devolvemos la vista public function postUsersAction(Request $request) { $view = FOSView::create(); … $formHandler = new ResourceFormHandler($form, $data); if ($formHandler->process()) { return $view->setStatusCode(Codes::HTTP_CREATED); } return $view->setStatusCode(Codes::HTTP_BAD_REQUEST) ->setData($formHandler->serializeFormErrors()); } Formularios Servidor deSymfony 2013Formularios y REST 47 / 62
  • 48. Formularios deSymfony 2013Formularios y REST Flujo de trabajo en lado cliente 48 / 62
  • 49. Formularios Cliente El formulario se trata como un formulario normal de Symfony2. A la hora de enviarlo a la API lo convertimos a un array. $modelFormClass->ToArray(). Guzzle para comunicación. deSymfony 2013Formularios y REST 49 / 62
  • 50. Casos Reales deSymfony 2013Formularios y REST Show me the code!
  • 51. Uso de eventos para realizar un PATCH deSymfony 2013Formularios y REST 51 / 62
  • 52. Uso de eventos para realizar un PATCH deSymfony 2013Formularios y REST 52 / 62
  • 53. Envío y tratamiento de imágenes CLIENTE deSymfony 2013Formularios y REST 53 / 62
  • 54. Envío y tratamiento de imágenes SERVIDOR deSymfony 2013Formularios y REST 54 / 62
  • 55. Envío y tratamiento de imágenes SERVIDOR deSymfony 2013Formularios y REST 55 / 62
  • 56. Envío y tratamiento de imágenes SERVIDOR deSymfony 2013Formularios y REST 56 / 62
  • 57. Envío y tratamiento de imágenes SERVIDOR deSymfony 2013Formularios y REST 57 / 62
  • 58. Envío y tratamiento de imágenes CLIENTE deSymfony 2013Formularios y REST 58 / 62
  • 59. Envío y tratamiento de imágenes CLIENTE deSymfony 2013Formularios y REST 59 / 62
  • 61. ¿Preguntas? deSymfony 2013Formularios y REST ¡Gracias! 61 / 62
  • 62. Gracias deSymfony 2013Formularios y REST Twitter: @moisesgallego Slideshare: http://www.slideshare.net/moisesgallego ¿Qué te ha parecido? Joind.in: https://joind.in/talk/view/8838 62 / 62

Notas del editor

  1. Buenos días Gracias por asistir. Voy a hablaros de ...
  2. Lo primero de todo es agradecer a todos nuestros patrocinadores el apoyo que dan a este evento, ya que sin ellos no sería posible
  3. Trabajo en BDK Nuevo proyecto api Experiencias reales Compañeros otras charlas
  4. Usuario twitter Usuario github.
  5. Soy miembro de SF Madrid Reunión mensual Cañas
  6. Cuentas mas activa lista de correo Videos en hangout
  7. Así que no dejes de pasarte si eres de madrid o estás de paso.
  8. Breve. Habrá amas charlas y no quiero ser pesado.
  9. ¿Que es REST?
  10. ¿en que consiste este sistema? ¿Que necesitamos?
  11. Hipermedia como el motor de estado de la aplicación
  12. ¿Pero como podemos crear una api REST con Symfony2? Pues os voy a hablar de dos posibilidades, la primera es el que he llamado “El método artesanal”
  13. .
  14. Lo único que cambia es el método y la acción.
  15. Decodificación del Request. Obtenemos toda la petición. Queremos saber qué quiere el cliente. Debemos responder con los estados correspondientes.
  16. No trabajamos así en BDK Código imcompleto
  17. Aquí cogemos el contenType y el formato del request para devolverle al controlador el tipo de vista que requiere el cliente.
  18. Finalmente obtenemos los datos que solicita el cliente, creamos la vista si lo que quiere es un HTML y se los devolvemos, en caso de que quiera un JSON o XML usamos el serializer para devolver. Fijaos también como a parte de valernos del Response para devolver el objeto serializado tenemos que setear el estado de HTTP que corresponda.
  19. Ya os he comentado anteriormente que nosotros no usamos esta forma “artesanal” de trabajar, el código que os he mostrado tampoco es nuestro. Así que os dejo un enlace a una presentación donde se profundiza bastante mas en esta forma de trabajar y donde se encuentra todo el código completo. No os preocupéis por copiar el enlace ahora, espero publicar cuanto antes esta charla en slideshare.
  20. Ya hemos visto el método artesanal, ahora es hora de que veamos algo un poco más mágico. Nuestro camino de baldosas amarillas. El que nosotros hemos decidido seguir.
  21. FOSRestBundle
  22. Así lo hacemos nosotros No nos fiamos de la mágia.
  23. Sencillo
  24. A través de listener POST GET (filtros)
  25. Opciones de los parámetros
  26. Vamos a ver un poco de la mágia que os he comentado antes. Un ejemplo de esta magia se encuentra en el sistema de rutas.
  27. Montar API con FOS sencillo No abusar de mágia Limitaciones en las rutas Da para otra charla
  28. FOSRestUtil constantes
  29. Se lo traga todo MongoDB arrayCollection, Posible hidratación
  30. Solo usamos los dos primeros Sandbox Último inestable
  31. Hasta ahora hemos visto como recibir las llamadas y como contestar, pero ¿Y como tratamos las llamadas POST y PUT? ¿Qué hacemos con los datos que recibimos en las llamadas?¿Como debemos tratarlos? Con formularios, o esa es la opción por la que nosostros nos hemos decantado.
  32. Conceptual Modelo → entidad/documento → formulario
  33. Type fuera de controller Manejador Objeto de dominio Charla de Ignacio Velazquez
  34. Hablemos ahora del flujo del lado servidor, de cómo podemos tratar los datos que hemos recibido por el request para poder adaptarlos para realizar la lógica de negocio necesaria. Tratar el modelo y devolver lo que tengamos que devolver al cliente.
  35. En la mayoría de los casos, en los más comunes nos bastará con coger el request siimplemente. Si el modelo no es demasiado complejo y es fácil adaptar un modelo “cliente” que recibir posiblemente nos bastará con coger los datos del request.
  36. Es el servidor el que dice como crear el request Modelo de datos complejo Objetos de dominio
  37. Mapeador.
  38. Explicar RECURSO. No entrar en los validadores.
  39. OJO. Error común Lo cometí la primera vez. Estamos en REST/Server Curl / Guzzle No tiene por que SF2 cliente
  40. ¿Y en el lado cliente?
  41. Recordad que es el servidor el que dice como debe ser la estructura El server espara siempre un array
  42. Veamos un par de casos reales. Os voy a mostrar la parte esencial del código, la chicha, no todo el código.
  43. Por ejemplo, En la versión 2.1 que es en la que desarrollamos esta funcionalidad, los formularios no pueden implementar el método PATCH. ¿Qué significa esto? Que cualquier dato que no le pasemos el sistema pensará que viene a nulo, por lo cual lo eliminará, cuando en realidad lo que queremos es que lo deje como estaba. ¿Como hemos implementado esto? Pues hemos creado un evento que salta justo antes de realizar el Bind del formulario. Carga dos arrays, el primero con los datos nuevos, el segundo llamando a una función unBind. Una vez tenemos los dos arrays los recoremos comparandolos y cambiamos solo los datos que realmente sean diferentes y distintos de nulo.
  44. En la función unBind lo que hace es recorrer recursivamente el formulario y cargar un array a través del método getClientData() los datos de antes del Bind. Como veis la potencia que nos dan los eventos es enorme, pero por si aún no estáis convencidos os voy a enseñar un caso que programamos hace tan solo unos días, así que si veis algún refactor es normal, y me lo podéis decir para meterlo ;)
  45. ¿Que pasa por ejemplo cuando queremos pasar imágenes a la api? Ese es el caso que os voy a contar ahora para finalizar mostrando un poco de toda la potencia del sistema de formularios en una api. Vayamos primero a la parte del cliente. Lo que hemos hecho ha sido crear una función recursiva en el manejador del formulario. Lo que hacemos es recorrer todos los campos y coger los que son de tipo file. Los que son de tipo file los recargamos con el binario de la imagen. Los que son de tipo collection los pasamos de nuevo por la función, ya que podemos tener subformularios con imágenes, como por ejemplo en el caso real teníamos hasta un tercer nivel de formulario con listado de imágenes. Una vez tenemos todo el formulario con los binarios se los enviamos mediante un array al servidor.
  46. Esperamos un array, sin tipado.
  47. Pues muy sencillo, para poder filtrarlo. Al igual que hicimos en el cliente montamos un evento en el preBind.
  48. En ese evento lo que hacemos es coger todos los que sean de tipo TextFile y llamar al servicio que manipula el binario, guardando de nuevo en el formulario antes del bind la cadena de texto con el nombre del fichero. Alguno pensará el ver el ćodigo ¿Por qué no es recurivo al igual que en cliente?¿Que pasa con los campos de segundo y tercer nivel? Pues muy sencillo el sistema de formularios lo hace por nosotros, ya que al tratarse de un evento de formuario se lanzará para el formulario padre y paras sus hijos y nietos. Aquí también debemos tener en cuenta que si viene a nulo hay que tener en cuenta el valor anterior, ya que no podemos obligar al cliente a que pase siempre el binario en cada actualización
  49. Aquí podéis ver como se crea el subscriber y como se le pasa el servicio, así como se setea el tipo de campo a las imágenes. ¿Sencillo verdad? Pero... ¿y que pasa cuando respondemos al cliente? Recordad que en el cliente el campo es de tipo file, si le devuelvo un texto con el nombre del fichero saltará un error. Y eso lo digo por experiencia ;)
  50. Pues aquí entra otra de las ventajas del uso de formularios. Los transformadores. Lo que decidimos crear fue transformador, uno muy senciĺlo. La transformación es, venga lo que venga mete un null en el campo y la inversa es que simplemente devuelva el dato del campo, en nuestro caso el binario.
  51. Finalmente añadimos el transformador a los campos de tipo file y se acabó.
  52. Como hemos visto durante este rato, ya sea a través de un camino de tierra como pueda ser el crear una api desde 0 o siguiendo un camino mágico de baldosas amarillas con algo de magía y acompañados de amigos como ApiDoc, serializer y el sistema de formularios. Symfony2 es una opción muy válida, potente y aunque a veces compleja es una opción muy a tener en cuenta para este tipo de trabajos, a la misma altura o incluso por encima de otros. Muchas gracias.
  53. ¿Preguntas? Gracias.
  54. Aquí os dejo de nuevo mis datos por si queréis consultarme cualquier cosa, mi cuenta de slideshare por si queréis consultar la ponencia. Por otro lado este año la organización ha creado una cuenta de joind para que podáis opinar. Cualquier critica es bienvenida. Gracias de nuevo a todos.