Desymfony - Servicios
-
Upload
ricard-clau -
Category
Documents
-
view
5.276 -
download
1
description
Transcript of Desymfony - Servicios
![Page 1: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/1.jpg)
![Page 2: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/2.jpg)
![Page 3: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/3.jpg)
Hello World
• Ricard Clau Pintado
• Trabajo en SocialPoint
• Antes en Emagister, Ulabox y Privalia
• Fundador Symfony-Barcelona
• Blogger http://www.ricardclau.com
• Twitter @ricardclau
![Page 4: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/4.jpg)
¿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
![Page 5: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/5.jpg)
Teoría y filosofía
Arquitectura SOA
![Page 6: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/6.jpg)
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)
![Page 7: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/7.jpg)
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!
![Page 8: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/8.jpg)
Servicios acoplados
![Page 9: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/9.jpg)
Servicios desacoplados :)
![Page 10: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/10.jpg)
El modelo en Symfony2Introducción a los servicios
![Page 11: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/11.jpg)
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...
![Page 12: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/12.jpg)
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!
![Page 13: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/13.jpg)
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.
![Page 14: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/14.jpg)
Servicios en Symfony2Ejemplos prácticos
![Page 15: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/15.jpg)
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”
![Page 16: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/16.jpg)
Listado de servicios
• php app/console container:debug
![Page 17: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/17.jpg)
¿Qué tengo en el container?
• https://github.com/Elao/WebProfilerExtraBundle
![Page 18: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/18.jpg)
Debug del container (I)
• https://github.com/schmittjoh/JMSDebuggingBundle
![Page 19: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/19.jpg)
Debug del container (II)
• https://github.com/schmittjoh/JMSDebuggingBundle
![Page 20: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/20.jpg)
Validator Service
![Page 21: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/21.jpg)
Mailer Service
![Page 22: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/22.jpg)
Configurando la aplicaciónCarga de nodos y inyección al container
![Page 23: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/23.jpg)
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
![Page 24: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/24.jpg)
[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
![Page 25: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/25.jpg)
Configuración compleja
• Se inyecta bien pero no tenemos validación!
![Page 26: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/26.jpg)
Bundle complejo -> a validar!
• Creamos los parámetros bajo la clave de nuestro bundle
![Page 27: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/27.jpg)
TreeBuilder
• Creamos un TreeBuilder en una clase Configuration dentro de la carpeta DependencyInjection
![Page 28: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/28.jpg)
Validando parámetros texto
![Page 29: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/29.jpg)
Validando estructura array
![Page 30: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/30.jpg)
Jugueteando con el array
![Page 31: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/31.jpg)
Exprimiendo el componente!
![Page 32: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/32.jpg)
BundleExtension
• Inyectamos la configuración en la Extension:
![Page 33: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/33.jpg)
Creación de serviciosInyección de dependencias
![Page 34: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/34.jpg)
Hello world Servicios• Servicio para recuperar información de Sensio Connect!
![Page 35: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/35.jpg)
Config y uso del servicio
• En el config de la aplicación
• Modificamos services.yml en Resources/config
• Y desde el controller
![Page 36: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/36.jpg)
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:
![Page 37: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/37.jpg)
Dependencias opcionales
• Setter Injection y otras inicializaciones -> calls
• Podemos combinarlo todo en servicios complejos
![Page 38: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/38.jpg)
Antipattern: setContainer
![Page 39: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/39.jpg)
Aplicaciones complejasServicios parent, factories y tags
![Page 40: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/40.jpg)
Servicios abstract / parent
![Page 41: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/41.jpg)
Service Factories
• El mejor ejemplo son los repositories
• Pero si hacemos esto
• Los controllers quedan así de limpios!
![Page 42: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/42.jpg)
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
![Page 43: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/43.jpg)
Service Tags (II)
• El componente Translator lo usa para los loaders
• O cuando necesitamos crear un Event Listener
![Page 44: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/44.jpg)
E-commerce con serviciosWeb Backoffice API (Iphone, ...)
KernelController Listeners / Before hooks (autenticaciones, ...)
Controllers ligeros que traducen Request a parámetros
BBDD No-SQL / Caches 3rd Party APIs
Servicios de primer nivel / unidades de negocio(Customer, Cart, Order, Catalogue)
Servicios auxiliares a modo de Helpers(Logger, Translator, Validator, Mailer, ...)
Interacción Storage / 3rd party (Entities, Repositories, Solarium, PRedis, OpenInviter...)
MODEL
![Page 45: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/45.jpg)
Agradecimientos
• A los Ulaboxers PHPeros: Sergi, Albert, Marc
• Al equipo #rigor de @EmagisterTech
• A la organización y sponsors de DeSymfony
• A todos vosotros :)
![Page 46: Desymfony - Servicios](https://reader033.fdocuments.ec/reader033/viewer/2022051210/54b7678d4a79595d768b4607/html5/thumbnails/46.jpg)
¿Preguntas?
• E-mail: [email protected]
• Twitter: @ricardclau
• Github: https://github.com/ricardclau
• O si os da corte ahora... en otro momento :)