Formularios y RESTdeSymfony 2013Moisés Gallego
deSymfony 2013Formularios y REST 4 / 62
@moisesgallegodeSymfony 2013Formularios y RESTgithub.com/mgallego5 / 62
deSymfony 2013Formularios y REST 6 / 62
deSymfony 2013Formularios y REST● Web: symfony-madrid.es● Twitter: @symfony_madrid● Comunidad G+: Symfony Madrid● Youtube:...
deSymfony 2013Formularios y RESTWE WANT YOU!WE WANT YOU!● Web: symfony-madrid.es● Twitter: @symfony_madrid● Comunidad G+: ...
¿Qué vamos a ver?Breve introducción a RESTCómo montar uno con Symfony2FOSRestBundleUso de formularios en RESTEjemplos de c...
¿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 seriesof constr...
¿Qué es REST?● Protocolo cliente/servidor sin estado● Operaciones POST, PUT, GET y DELETE● Sintaxis universal● Hipermedios...
¿Qué es REST?deSymfony 2013Formularios y REST 13 / 62HATEOAS(Hypermedia as the Engine of Application State){nombre: Moises...
REST en Symfony2deSymfony 2013Formularios y RESTEl Método Artesanal14 / 62
REST en Symfony2El método ArtesanalREQUESTCreación de rutas y métodos apropiados con elRouter de Symfony2Sintaxis Universa...
REST en Symfony2El método ArtesanalEjemplo GETget_resources:path: /api/v1/resourcesdefaults: { _controller: AcmeDemoBundle...
REST en Symfony2El método ArtesanalCONTROLADOR HTTPDeserialización del RequestManejar cabecerasHTTP Status CodesdeSymfony ...
REST en Symfony2El método ArtesanalCONTROLADORAdaptamos la petición que recibimos clienteLógica de negocioManejar erroresC...
REST en Symfony2El método ArtesanaldeSymfony 2013Formularios y REST 19 / 62
REST en Symfony2El método ArtesanaldeSymfony 2013Formularios y REST 20 / 62
REST en Symfony2El método ArtesanaldeSymfony 2013Formularios y REST 21 / 62
REST en Symfony2El método ArtesanaldeSymfony 2013Formularios y RESTSymfony REST and RADhttp://www.beberlei.de/talks/symfon...
REST en Symfony2deSymfony 2013Formularios y RESTEl camino debaldosas amarillas23 / 62
FOSRestBundledeSymfony 2013Formularios y REST 24 / 62
FOSRestBundle¿Qué ofrece?●Capa de vista con formato agnóstico de salida●Cargador de rutas adaptado●Decodificación de petic...
FOSRestBundleREQUESTMétodos a través de anotacionesFOSRestBundleControllerAnnotationsGetFOSRestBundleControllerAnnotations...
Ejemplo/*** Lists resources.** @Get("api/v1/public/resource/{id}")*/public function getResourceAction($id){….}deSymfony 20...
Decodificación de peticiones HTTP@ParamFetcher(FOSRestBundleRequestParamFetcher)@QueryParam(FOSRestBundleControllerAnnotat...
Ejemplo ParamFetcher/*** Lists resources.** @param ParamFetcher $paramFetcher*/public function getResourceAction(ParamFetc...
Ejemplo QueryParam/*** Lists resources.** @QueryParam(name="page", requirements="d+", default="1",description="Page of the...
Podemos crear acciones en los controladores del tipogetRecursoAction, postRecursoAction, etc yautomáticamente FOSRestBundl...
<?phpclass UsersController{public function getUserAction($slug){} // "get_user" [GET] /users/{slug}public function getUser...
Con una anotación del tipo@RouteResource(“Recurso”) en el controladorpodemos crear acciones llamadas getAction,postAction,...
/*** @RouteResource("User")*/class FooController{public function cgetAction(){} // "get_users" [GET] /userspublic function...
Mas sencillo aún que el RequestCreamos una vista$view = FOSView::create();La devolvemosreturn $view->setStatusCode(Codes::...
Ejemplopublic function getResourceAction($id){$view = FOSView::create();...//cargamos una variable $data por ejemplo con D...
JMSSerializerBundleNelmioApiDocBundleFSCHateoasBundleHautelook/TemplateUriBundledeSymfony 2013Formularios y RESTOtros Bund...
¿Y cómo tratamos lo querecibimos por POST y PUT?deSymfony 2013Formularios y RESTFormularios38 / 62
Formularios¿Que ventajas aportan?Podemos usarlos como recursos e incluso subrecursos.La carga de datos del request al mode...
●FormType●FormHandler●FormModelFormularios al límite [deSymfony2012](http://desymfony.com/ponencia/2012/formularios)Formul...
FormulariosdeSymfony 2013Formularios y RESTFlujo de trabajo en ladoservidor41 / 62
Obtenemos el Requestpublic function postUsersAction(Request $request){$view = FOSView::create();$data = $request->request-...
Adaptamos el Requestclass RequestToNewDataTransformer{public static function transform(array $array, ...){//Realizamos la ...
Adaptamos el Requestpublic function postUsersAction(Request $request){$view = FOSView::create();$data = $this->reMap($requ...
Creamos el formularioY lo validamospublic function postUsersAction(Request $request){$view = FOSView::create();…$form = $t...
¡Ojo!El Required del FormType no hace unavalidación real, solo se usa para realizar unavalidación a través de HTML5, pero ...
Procesamos el formularioY devolvemos la vistapublic function postUsersAction(Request $request){$view = FOSView::create();…...
FormulariosdeSymfony 2013Formularios y RESTFlujo de trabajo en ladocliente48 / 62
FormulariosClienteEl formulario se trata como un formulario normal deSymfony2.A la hora de enviarlo a la API lo convertimo...
Casos RealesdeSymfony 2013Formularios y RESTShow me the code!
Uso de eventos para realizar un PATCHdeSymfony 2013Formularios y REST 51 / 62
Uso de eventos para realizar un PATCHdeSymfony 2013Formularios y REST 52 / 62
Envío y tratamiento de imágenesCLIENTEdeSymfony 2013Formularios y REST 53 / 62
Envío y tratamiento de imágenesSERVIDORdeSymfony 2013Formularios y REST 54 / 62
Envío y tratamiento de imágenesSERVIDORdeSymfony 2013Formularios y REST 55 / 62
Envío y tratamiento de imágenesSERVIDORdeSymfony 2013Formularios y REST 56 / 62
Envío y tratamiento de imágenesSERVIDORdeSymfony 2013Formularios y REST 57 / 62
Envío y tratamiento de imágenesCLIENTEdeSymfony 2013Formularios y REST 58 / 62
Envío y tratamiento de imágenesCLIENTEdeSymfony 2013Formularios y REST 59 / 62
ConclusióndeSymfony 2013Formularios y REST 60 / 62
¿Preguntas?deSymfony 2013Formularios y REST¡Gracias!61 / 62
GraciasdeSymfony 2013Formularios y RESTTwitter: @moisesgallegoSlideshare: http://www.slideshare.net/moisesgallego¿Qué te h...
Formularios y REST (deSymfony2013)
Formularios y REST (deSymfony2013)
Upcoming SlideShare
Loading in …5
×

Formularios y REST (deSymfony2013)

4,096 views

Published on

Como ya se puede intuir hablaremos de cómo utilizamos en Bodaclick el potente sistema de
formularios de Symfony 2 para mapear las peticiones REST (PUT y POST) de nuestra API
(potenciada por FOSRestBundle) al modelo de datos pasando por DataTransformers y el
sistema de validación

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,096
On SlideShare
0
From Embeds
0
Number of Embeds
1,479
Actions
Shares
0
Downloads
60
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide
  • Buenos días Gracias por asistir. Voy a hablaros de ...
  • 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
  • Trabajo en BDK Nuevo proyecto api Experiencias reales Compañeros otras charlas
  • Usuario twitter Usuario github.
  • Soy miembro de SF Madrid Reunión mensual Cañas
  • Cuentas mas activa lista de correo Videos en hangout
  • Así que no dejes de pasarte si eres de madrid o estás de paso.
  • Breve. Habrá amas charlas y no quiero ser pesado.
  • ¿Que es REST?
  • ¿en que consiste este sistema? ¿Que necesitamos?
  • Hipermedia como el motor de estado de la aplicación
  • ¿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”
  • .
  • Lo único que cambia es el método y la acción.
  • Decodificación del Request. Obtenemos toda la petición. Queremos saber qué quiere el cliente. Debemos responder con los estados correspondientes.
  • No trabajamos así en BDK Código imcompleto
  • Aquí cogemos el contenType y el formato del request para devolverle al controlador el tipo de vista que requiere el cliente.
  • 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.
  • 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.
  • 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.
  • FOSRestBundle
  • Así lo hacemos nosotros No nos fiamos de la mágia.
  • Sencillo
  • A través de listener POST GET (filtros)
  • Opciones de los parámetros
  • 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.
  • Montar API con FOS sencillo No abusar de mágia Limitaciones en las rutas Da para otra charla
  • FOSRestUtil constantes
  • Se lo traga todo MongoDB arrayCollection, Posible hidratación
  • Solo usamos los dos primeros Sandbox Último inestable
  • 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.
  • Conceptual Modelo → entidad/documento → formulario
  • Type fuera de controller Manejador Objeto de dominio Charla de Ignacio Velazquez
  • 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.
  • 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.
  • Es el servidor el que dice como crear el request Modelo de datos complejo Objetos de dominio
  • Mapeador.
  • Explicar RECURSO. No entrar en los validadores.
  • OJO. Error común Lo cometí la primera vez. Estamos en REST/Server Curl / Guzzle No tiene por que SF2 cliente
  • ¿Y en el lado cliente?
  • Recordad que es el servidor el que dice como debe ser la estructura El server espara siempre un array
  • Veamos un par de casos reales. Os voy a mostrar la parte esencial del código, la chicha, no todo el código.
  • 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.
  • 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 ;)
  • ¿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.
  • Esperamos un array, sin tipado.
  • Pues muy sencillo, para poder filtrarlo. Al igual que hicimos en el cliente montamos un evento en el preBind.
  • 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
  • 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 ;)
  • 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.
  • Finalmente añadimos el transformador a los campos de tipo file y se acabó.
  • 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.
  • ¿Preguntas? Gracias.
  • 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.
  • Formularios y REST (deSymfony2013)

    1. 1. Formularios y RESTdeSymfony 2013Moisés Gallego
    2. 2. deSymfony 2013Formularios y REST 4 / 62
    3. 3. @moisesgallegodeSymfony 2013Formularios y RESTgithub.com/mgallego5 / 62
    4. 4. deSymfony 2013Formularios y REST 6 / 62
    5. 5. 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_madrid7 / 62
    6. 6. deSymfony 2013Formularios y RESTWE 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_madrid8 / 62
    7. 7. ¿Qué vamos a ver?Breve introducción a RESTCómo montar uno con Symfony2FOSRestBundleUso de formularios en RESTEjemplos de códigodeSymfony 2013Formularios y REST 9 / 62
    8. 8. ¿Qué es REST?deSymfony 2013Formularios y REST 10 / 62
    9. 9. ¿Qué es REST?“Architectural Styles and the Design of Network-based Software Architectures” and describes a seriesof constraints that exemplify how the web’s designemerged utilizing the Hyper Text Transfer Protocol.”by Roy Fielding’s Doctoral ThesisdeSymfony 2013Formularios y REST 11 / 62
    10. 10. ¿Qué es REST?● Protocolo cliente/servidor sin estado● Operaciones POST, PUT, GET y DELETE● Sintaxis universal● Hipermedios (HATEOAS)deSymfony 2013Formularios y REST 12 / 62
    11. 11. ¿Qué es REST?deSymfony 2013Formularios y REST 13 / 62HATEOAS(Hypermedia as the Engine of Application State){nombre: Moises,apellido: Gallego,…..direccion: {calle: falsa,numero: 123,Uri: /api/v1/addesses/1}}Charlie dont code(http://charliedontcode.com/rest/2012/09/27/rest-apis-hateoas.html)
    12. 12. REST en Symfony2deSymfony 2013Formularios y RESTEl Método Artesanal14 / 62
    13. 13. REST en Symfony2El método ArtesanalREQUESTCreación de rutas y métodos apropiados con elRouter de Symfony2Sintaxis Universalmethods:[GET, PUT, POST, DELETE]deSymfony 2013Formularios y REST 15 / 62
    14. 14. REST en Symfony2El método ArtesanalEjemplo GETget_resources:path: /api/v1/resourcesdefaults: { _controller: AcmeDemoBundle:Main:getResources }methods: [GET]Ejemplo POSTpost_resources:path: /api/v1/resourcesdefaults: { _controller: AcmeDemoBundle:Main:postResources }methods: [POST]deSymfony 2013Formularios y REST 16 / 62
    15. 15. REST en Symfony2El método ArtesanalCONTROLADOR HTTPDeserialización del RequestManejar cabecerasHTTP Status CodesdeSymfony 2013Formularios y REST 17 / 62
    16. 16. REST en Symfony2El método ArtesanalCONTROLADORAdaptamos la petición que recibimos clienteLógica de negocioManejar erroresCrear una vistaPasar el modelo a la vistadeSymfony 2013Formularios y REST 18 / 62
    17. 17. REST en Symfony2El método ArtesanaldeSymfony 2013Formularios y REST 19 / 62
    18. 18. REST en Symfony2El método ArtesanaldeSymfony 2013Formularios y REST 20 / 62
    19. 19. REST en Symfony2El método ArtesanaldeSymfony 2013Formularios y REST 21 / 62
    20. 20. REST en Symfony2El método ArtesanaldeSymfony 2013Formularios y RESTSymfony REST and RADhttp://www.beberlei.de/talks/symfony-rest22 / 62
    21. 21. REST en Symfony2deSymfony 2013Formularios y RESTEl camino debaldosas amarillas23 / 62
    22. 22. FOSRestBundledeSymfony 2013Formularios y REST 24 / 62
    23. 23. 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
    24. 24. FOSRestBundleREQUESTMétodos a través de anotacionesFOSRestBundleControllerAnnotationsGetFOSRestBundleControllerAnnotationsPostFOSRestBundleControllerAnnotationsPutFOSRestBundleControllerAnnotationsDeletedeSymfony 2013Formularios y REST 26 / 62
    25. 25. Ejemplo/*** Lists resources.** @Get("api/v1/public/resource/{id}")*/public function getResourceAction($id){….}deSymfony 2013Formularios y RESTFOSRestBundleREQUESTFOSRestBundleREQUEST27 / 62
    26. 26. Decodificación de peticiones HTTP@ParamFetcher(FOSRestBundleRequestParamFetcher)@QueryParam(FOSRestBundleControllerAnnotationsQueryParam)deSymfony 2013Formularios y RESTFOSRestBundleREQUEST28 / 62
    27. 27. Ejemplo ParamFetcher/*** Lists resources.** @param ParamFetcher $paramFetcher*/public function getResourceAction(ParamFetcher $paramFetcher){$page = $paramFetcher->get(page);….}deSymfony 2013Formularios y RESTFOSRestBundleREQUESTFOSRestBundleREQUEST29 / 62
    28. 28. Ejemplo QueryParam/*** Lists resources.** @QueryParam(name="page", requirements="d+", default="1",description="Page of the overview.")*/public function getResourceAction($page){….}deSymfony 2013Formularios y RESTFOSRestBundleREQUESTFOSRestBundleREQUEST30 / 62
    29. 29. Podemos crear acciones en los controladores del tipogetRecursoAction, postRecursoAction, etc yautomáticamente FOSRestBundle genera los métodosy rutas e incluso crea automáticamente los plurales.deSymfony 2013Formularios y RESTFOSRestBundleUn poquito de magia31 / 62
    30. 30. <?phpclass UsersController{public function getUserAction($slug){} // "get_user" [GET] /users/{slug}public function getUsersAction(){} // "get_users" [GET] /userspublic function postUsersAction(){} // "post_users" [POST] /userspublic function patchUsersAction(){} // "patch_users" [PATCH] /usersdeSymfony 2013Formularios y RESTFOSRestBundleUn poquito de magia32 / 62
    31. 31. Con una anotación del tipo@RouteResource(“Recurso”) en el controladorpodemos crear acciones llamadas getAction,postAction, etc y él se encarga de el restodeSymfony 2013Formularios y RESTFOSRestBundleUn poquito de magia33 / 62
    32. 32. /*** @RouteResource("User")*/class FooController{public function cgetAction(){} // "get_users" [GET] /userspublic function newAction(){} // "new_users" [GET] /users/newpublic function getAction($slug){} // "get_user" [GET] /users/{slug}..public function getCommentsAction($slug){} // "get_user_comments" [GET] /users/{slug}/comments..}deSymfony 2013Formularios y RESTFOSRestBundleUn poquito de magia34 / 62
    33. 33. Mas sencillo aún que el RequestCreamos una vista$view = FOSView::create();La devolvemosreturn $view->setStatusCode(Codes::HTTP_OK)->setData($data);deSymfony 2013Formularios y RESTFOSRestBundleRESPONSE35 / 62
    34. 34. Ejemplopublic 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 RESTFOSRestBundleRESPONSE36 / 62
    35. 35. JMSSerializerBundleNelmioApiDocBundleFSCHateoasBundleHautelook/TemplateUriBundledeSymfony 2013Formularios y RESTOtros Bundles de utilidad37 / 62
    36. 36. ¿Y cómo tratamos lo querecibimos por POST y PUT?deSymfony 2013Formularios y RESTFormularios38 / 62
    37. 37. Formularios¿Que ventajas aportan?Podemos usarlos como recursos e incluso subrecursos.La carga de datos del request al modelo es automática através de los métodos Bind que implementa.Simplifica el uso de validadores.DataTransformers.Uso parecido en el lado clienteEventosdeSymfony 2013Formularios y REST 39 / 62
    38. 38. ●FormType●FormHandler●FormModelFormularios al límite [deSymfony2012](http://desymfony.com/ponencia/2012/formularios)Formularios¿Cómo trabajamos?deSymfony 2013Formularios y REST 40 / 62
    39. 39. FormulariosdeSymfony 2013Formularios y RESTFlujo de trabajo en ladoservidor41 / 62
    40. 40. Obtenemos el Requestpublic function postUsersAction(Request $request){$view = FOSView::create();$data = $request->request->all();…}FormulariosServidordeSymfony 2013Formularios y REST 42 / 62
    41. 41. Adaptamos el Requestclass RequestToNewDataTransformer{public static function transform(array $array, ...){//Realizamos la transformación de los datosreturn $newArray;}}FormulariosServidordeSymfony 2013Formularios y REST 43 / 62
    42. 42. Adaptamos el Requestpublic function postUsersAction(Request $request){$view = FOSView::create();$data = $this->reMap($request->request->all(),…);...}FormulariosServidordeSymfony 2013Formularios y REST 44 / 62
    43. 43. Creamos el formularioY lo validamospublic function postUsersAction(Request $request){$view = FOSView::create();…$form = $this->createForm(new $formType(),$resource,[validation_groups => [Create, Default]]);}FormulariosServidordeSymfony 2013Formularios y REST 45 / 62
    44. 44. ¡Ojo!El Required del FormType no hace unavalidación real, solo se usa para realizar unavalidación a través de HTML5, pero no en ellado del servidor.FormulariosServidordeSymfony 2013Formularios y REST 46 / 62
    45. 45. Procesamos el formularioY devolvemos la vistapublic 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());}FormulariosServidordeSymfony 2013Formularios y REST 47 / 62
    46. 46. FormulariosdeSymfony 2013Formularios y RESTFlujo de trabajo en ladocliente48 / 62
    47. 47. FormulariosClienteEl formulario se trata como un formulario normal deSymfony2.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
    48. 48. Casos RealesdeSymfony 2013Formularios y RESTShow me the code!
    49. 49. Uso de eventos para realizar un PATCHdeSymfony 2013Formularios y REST 51 / 62
    50. 50. Uso de eventos para realizar un PATCHdeSymfony 2013Formularios y REST 52 / 62
    51. 51. Envío y tratamiento de imágenesCLIENTEdeSymfony 2013Formularios y REST 53 / 62
    52. 52. Envío y tratamiento de imágenesSERVIDORdeSymfony 2013Formularios y REST 54 / 62
    53. 53. Envío y tratamiento de imágenesSERVIDORdeSymfony 2013Formularios y REST 55 / 62
    54. 54. Envío y tratamiento de imágenesSERVIDORdeSymfony 2013Formularios y REST 56 / 62
    55. 55. Envío y tratamiento de imágenesSERVIDORdeSymfony 2013Formularios y REST 57 / 62
    56. 56. Envío y tratamiento de imágenesCLIENTEdeSymfony 2013Formularios y REST 58 / 62
    57. 57. Envío y tratamiento de imágenesCLIENTEdeSymfony 2013Formularios y REST 59 / 62
    58. 58. ConclusióndeSymfony 2013Formularios y REST 60 / 62
    59. 59. ¿Preguntas?deSymfony 2013Formularios y REST¡Gracias!61 / 62
    60. 60. GraciasdeSymfony 2013Formularios y RESTTwitter: @moisesgallegoSlideshare: http://www.slideshare.net/moisesgallego¿Qué te ha parecido?Joind.in: https://joind.in/talk/view/883862 / 62

    ×