desymfony - servicios

46

Upload: ricard-clau

Post on 15-Jan-2015

5.276 views

Category:

Documents


1 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Desymfony  - Servicios
Page 2: Desymfony  - Servicios
Page 3: Desymfony  - Servicios

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

¿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

Teoría y filosofía

Arquitectura SOA

Page 6: Desymfony  - Servicios

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

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

Servicios acoplados

Page 9: Desymfony  - Servicios

Servicios desacoplados :)

Page 10: Desymfony  - Servicios

El modelo en Symfony2Introducción a los servicios

Page 11: Desymfony  - Servicios

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

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

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

Servicios en Symfony2Ejemplos prácticos

Page 15: Desymfony  - Servicios

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

Listado de servicios

• php app/console container:debug

Page 17: Desymfony  - Servicios

¿Qué tengo en el container?

• https://github.com/Elao/WebProfilerExtraBundle

Page 18: Desymfony  - Servicios

Debug del container (I)

• https://github.com/schmittjoh/JMSDebuggingBundle

Page 19: Desymfony  - Servicios

Debug del container (II)

• https://github.com/schmittjoh/JMSDebuggingBundle

Page 20: Desymfony  - Servicios

Validator Service

Page 21: Desymfony  - Servicios

Mailer Service

Page 22: Desymfony  - Servicios

Configurando la aplicaciónCarga de nodos y inyección al container

Page 23: Desymfony  - Servicios

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

[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

Configuración compleja

• Se inyecta bien pero no tenemos validación!

Page 26: Desymfony  - Servicios

Bundle complejo -> a validar!

• Creamos los parámetros bajo la clave de nuestro bundle

Page 27: Desymfony  - Servicios

TreeBuilder

• Creamos un TreeBuilder en una clase Configuration dentro de la carpeta DependencyInjection

Page 28: Desymfony  - Servicios

Validando parámetros texto

Page 29: Desymfony  - Servicios

Validando estructura array

Page 30: Desymfony  - Servicios

Jugueteando con el array

Page 31: Desymfony  - Servicios

Exprimiendo el componente!

Page 32: Desymfony  - Servicios

BundleExtension

• Inyectamos la configuración en la Extension:

Page 33: Desymfony  - Servicios

Creación de serviciosInyección de dependencias

Page 34: Desymfony  - Servicios

Hello world Servicios• Servicio para recuperar información de Sensio Connect!

Page 35: Desymfony  - Servicios

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

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

Dependencias opcionales

• Setter Injection y otras inicializaciones -> calls

• Podemos combinarlo todo en servicios complejos

Page 38: Desymfony  - Servicios

Antipattern: setContainer

Page 39: Desymfony  - Servicios

Aplicaciones complejasServicios parent, factories y tags

Page 40: Desymfony  - Servicios

Servicios abstract / parent

Page 41: Desymfony  - Servicios

Service Factories

• El mejor ejemplo son los repositories

• Pero si hacemos esto

• Los controllers quedan así de limpios!

Page 42: Desymfony  - Servicios

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

Service Tags (II)

• El componente Translator lo usa para los loaders

• O cuando necesitamos crear un Event Listener

Page 44: Desymfony  - Servicios

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

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

¿Preguntas?

• E-mail: [email protected]

• Twitter: @ricardclau

• Github: https://github.com/ricardclau

• O si os da corte ahora... en otro momento :)