Your SlideShare is downloading. ×
0
Hello World•   Ricard Clau Pintado•   Trabajo en SocialPoint•   Antes en Emagister, Ulabox y Privalia•   Fundador Symfony-...
¿Qué vamos a ver?•   Arquitectura orientada a servicios (SOA)•   La capa de modelo en Symfony2•   Servicios en Symfony2•  ...
Arquitectura SOA        Teoría y filosofía
El concepto SOA•   Arquitectura Orientada a Servicios•   Los Servicios son clases creadas para desarrollar una    función ...
No todo es tan fácil•   Es una filosofía entorno al patrón de diseño Service Layer•   Parece que estamos trabajando más•   ...
Servicios acoplados
Servicios desacoplados :)
El modelo en Symfony2        Introducción a los servicios
La evolución del MVC•   Symfony2 no es un framework MVC estrictamente•   De hecho, la carpeta “Model” no existe por defect...
Y entonces... ¿Doctrine2?•   Doctrine2 abstrae el acceso al sistema de    almacenamiento, tanto SQL como algunos No-SQL•  ...
El modelo en Symfony2•   En Symfony2, más que hablar del modelo, podemos    hablar de la capa de servicios•   Hay que evit...
Servicios en Symfony2            Ejemplos prácticos
Servicios en Symfony2•   Muchos de los componentes de Symfony2 están    disponibles como servicios•   Algunos: Doctrine2 E...
Listado de servicios•   php app/console container:debug
¿Qué tengo en el container?•   https://github.com/Elao/WebProfilerExtraBundle
Debug del container (I)•   https://github.com/schmittjoh/JMSDebuggingBundle
Debug del container (II)•   https://github.com/schmittjoh/JMSDebuggingBundle
Validator Service
Mailer Service
Configurando la aplicación      Carga de nodos y inyección al container
Configuraciones en Symfony2•   app/config -> aplicación Resources/config -> Bundles•   Configuración base que extendemos para ...
[parameters]•   Se suelen definir constantes de configuración•   Permite que cada usuario tenga el setup como quiera•   Los ...
Configuración compleja•   Se inyecta bien pero no tenemos validación!
Bundle complejo -> a validar!•   Creamos los parámetros bajo la clave de nuestro bundle
TreeBuilder•   Creamos un TreeBuilder en una clase Configuration    dentro de la carpeta DependencyInjection
Validando parámetros texto
Validando estructura array
Jugueteando con el array
Exprimiendo el componente!
BundleExtension•   Inyectamos la configuración en la Extension:
Creación de servicios       Inyección de dependencias
Hello world Servicios•   Servicio para recuperar información de Sensio Connect!
Config y uso del servicio•   En el config de la aplicación•   Modificamos services.yml en Resources/config•   Y desde el contr...
Dependencias de un servicio•   Un servicio puede depender de parámetros de    configuración y/o de otros servicios•   Nos r...
Dependencias opcionales•   Setter Injection y otras inicializaciones -> calls•   Podemos combinarlo todo en servicios comp...
Antipattern: setContainer
Aplicaciones complejas      Servicios parent, factories y tags
Servicios abstract / parent
Service Factories•   El mejor ejemplo son los repositories•   Pero si hacemos esto•   Los controllers quedan así de limpios!
Service Tags (I)•   Agrupación de servicios•   El tag en sí no significa nada pero puede ser útil para    extender componen...
Service Tags (II)•   El componente Translator lo usa para los loaders•   O cuando necesitamos crear un Event Listener
E-commerce con servicios    Web                Backoffice              API (Iphone, ...)KernelController Listeners / Before...
Agradecimientos•   A los Ulaboxers PHPeros: Sergi, Albert, Marc•   Al equipo #rigor de @EmagisterTech•   A la organización...
¿Preguntas?•   E-mail: ricard.clau@gmail.com•   Twitter: @ricardclau•   Github: https://github.com/ricardclau•   O si os d...
Desymfony  - Servicios
Desymfony  - Servicios
Upcoming SlideShare
Loading in...5
×

Desymfony - Servicios

5,534

Published on

Las transparencias de mi charla sobre Servicios en Symfony2 en deSymfony 2012

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,534
On Slideshare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
111
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Transcript of "Desymfony - Servicios"

  1. 1. Hello World• Ricard Clau Pintado• Trabajo en SocialPoint• Antes en Emagister, Ulabox y Privalia• Fundador Symfony-Barcelona• Blogger http://www.ricardclau.com• Twitter @ricardclau
  2. 2. ¿Qué vamos a ver?• Arquitectura orientada a servicios (SOA)• La capa de modelo en Symfony2• Servicios en Symfony2• Componente Configuration• Inyección de dependencias• Experiencias en el desarrollo de Ulabox.com
  3. 3. Arquitectura SOA Teoría y filosofía
  4. 4. El concepto SOA• Arquitectura Orientada a Servicios• Los Servicios son clases creadas para desarrollar una función específica y se pueden utilizar en cualquier punto de nuestra aplicación.• Encapsulando la lógica de negocio en servicios podemos desacoplar las clases de nuestra aplicación, que podrá crecer “sin problemas”• Todas las plataformas grandes lo usan (o deberían)
  5. 5. No todo es tan fácil• Es una filosofía entorno al patrón de diseño Service Layer• Parece que estamos trabajando más• Es muy importante delimitar la responsabilidad de cada servicio y no acoplarlos• Hay que concienciar a todo el equipo, formar a los juniors y convencer a la gente con malos hábitos• Puede ser complicado de aplicar en código legado• Pero... ¡se puede hacer gradualmente!
  6. 6. Servicios acoplados
  7. 7. Servicios desacoplados :)
  8. 8. El modelo en Symfony2 Introducción a los servicios
  9. 9. La evolución del MVC• Symfony2 no es un framework MVC estrictamente• De hecho, la carpeta “Model” no existe por defecto!• Es tan flexible que nos da la libertad de construir la capa de Modelo como convenga a nuestra aplicación• Y eso puede ser peligroso...
  10. 10. Y entonces... ¿Doctrine2?• Doctrine2 abstrae el acceso al sistema de almacenamiento, tanto SQL como algunos No-SQL• Las “Entities” mapean tablas (ORM) / documentos (ODM)• Los “Repositories” permiten encapsular operaciones y realizar consultas algo más complejas• Pero ahí no debería ir la lógica de negocio!
  11. 11. El modelo en Symfony2• En Symfony2, más que hablar del modelo, podemos hablar de la capa de servicios• Hay que evitar los controllers de 2000 líneas• En los repositories no deberíamos poner lógica de negocio, son para querys complejas• Las vistas deben tener la mínima lógica posible• Cada servicio debe recibir sólo lo que necesita y exponer unas interficies claras para su uso. Nunca usar el Request ni modificar la Response.
  12. 12. Servicios en Symfony2 Ejemplos prácticos
  13. 13. Servicios en Symfony2• Muchos de los componentes de Symfony2 están disponibles como servicios• Algunos: Doctrine2 Entity Manager, Swiftmailer, Validator, Translator, Templating, Routing, ...• Muchos bundles añaden nuevos servicios y podemos crear nuestros propios servicios!• Acceso mediante el “Dependency Injection Container” desde las clases con interface “ContainerAware”
  14. 14. Listado de servicios• php app/console container:debug
  15. 15. ¿Qué tengo en el container?• https://github.com/Elao/WebProfilerExtraBundle
  16. 16. Debug del container (I)• https://github.com/schmittjoh/JMSDebuggingBundle
  17. 17. Debug del container (II)• https://github.com/schmittjoh/JMSDebuggingBundle
  18. 18. Validator Service
  19. 19. Mailer Service
  20. 20. Configurando la aplicación Carga de nodos y inyección al container
  21. 21. Configuraciones en Symfony2• app/config -> aplicación Resources/config -> Bundles• Configuración base que extendemos para el resto de entornos• Conveniente separarlo en varios archivos
  22. 22. [parameters]• Se suelen definir constantes de configuración• Permite que cada usuario tenga el setup como quiera• Los valores bajo la clave [parameters] se inyectan en el container directamente. Podemos usarlos en otras secciones con %valor%• Podemos crear nuestras propias claves para configurar nuestros bundles, que deberán ser leídas en los archivos de la carpeta DependencyInjection
  23. 23. Configuración compleja• Se inyecta bien pero no tenemos validación!
  24. 24. Bundle complejo -> a validar!• Creamos los parámetros bajo la clave de nuestro bundle
  25. 25. TreeBuilder• Creamos un TreeBuilder en una clase Configuration dentro de la carpeta DependencyInjection
  26. 26. Validando parámetros texto
  27. 27. Validando estructura array
  28. 28. Jugueteando con el array
  29. 29. Exprimiendo el componente!
  30. 30. BundleExtension• Inyectamos la configuración en la Extension:
  31. 31. Creación de servicios Inyección de dependencias
  32. 32. Hello world Servicios• Servicio para recuperar información de Sensio Connect!
  33. 33. Config y uso del servicio• En el config de la aplicación• Modificamos services.yml en Resources/config• Y desde el controller
  34. 34. Dependencias de un servicio• Un servicio puede depender de parámetros de configuración y/o de otros servicios• Nos referimos a los parámetros con %param% y los servicios con @nombre_servicio• Constructor Injection -> arguments:
  35. 35. Dependencias opcionales• Setter Injection y otras inicializaciones -> calls• Podemos combinarlo todo en servicios complejos
  36. 36. Antipattern: setContainer
  37. 37. Aplicaciones complejas Servicios parent, factories y tags
  38. 38. Servicios abstract / parent
  39. 39. Service Factories• El mejor ejemplo son los repositories• Pero si hacemos esto• Los controllers quedan así de limpios!
  40. 40. Service Tags (I)• Agrupación de servicios• El tag en sí no significa nada pero puede ser útil para extender componentes con nuevos loaders / adapters. Suelen procesarse en las CompilerPass• Lo usamos en Twig para cargar extensiones
  41. 41. Service Tags (II)• El componente Translator lo usa para los loaders• O cuando necesitamos crear un Event Listener
  42. 42. E-commerce con servicios Web Backoffice API (Iphone, ...)KernelController Listeners / Before hooks (autenticaciones, ...) Controllers ligeros que traducen Request a parámetros Servicios de primer nivel / unidades de negocio M (Customer, Cart, Order, Catalogue) O Servicios auxiliares a modo de Helpers (Logger, Translator, Validator, Mailer, ...) D Interacción Storage / 3rd party E (Entities, Repositories, Solarium, PRedis, OpenInviter...) L BBDD No-SQL / Caches 3rd Party APIs
  43. 43. Agradecimientos• A los Ulaboxers PHPeros: Sergi, Albert, Marc• Al equipo #rigor de @EmagisterTech• A la organización y sponsors de DeSymfony• A todos vosotros :)
  44. 44. ¿Preguntas?• E-mail: ricard.clau@gmail.com• Twitter: @ricardclau• Github: https://github.com/ricardclau• O si os da corte ahora... en otro momento :)
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×