SlideShare una empresa de Scribd logo
1 de 46
Descargar para leer sin conexión
Hello World
•   Ricard Clau Pintado

•   Trabajo en SocialPoint

•   Antes en Emagister, Ulabox y Privalia

•   Fundador Symfony-Barcelona

•   Blogger http://www.ricardclau.com

•   Twitter @ricardclau
¿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
Arquitectura SOA
        Teoría y filosofía
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)
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!
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 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...
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!
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.
Servicios en Symfony2
            Ejemplos prácticos
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”
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 el resto de
    entornos



•   Conveniente separarlo en varios archivos
[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
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 controller
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:
Dependencias opcionales
•   Setter Injection y otras inicializaciones -> calls

•   Podemos combinarlo todo en servicios complejos
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 componentes con nuevos loaders / adapters.
    Suelen procesarse en las CompilerPass

•   Lo usamos en Twig para cargar extensiones
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 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
Agradecimientos
•   A los Ulaboxers PHPeros: Sergi, Albert, Marc

•   Al equipo #rigor de @EmagisterTech

•   A la organización y sponsors de DeSymfony

•   A todos vosotros :)
¿Preguntas?
•   E-mail: ricard.clau@gmail.com

•   Twitter: @ricardclau

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




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

Más contenido relacionado

La actualidad más candente

BBVA Arquitectura - Demo DevOps
BBVA Arquitectura - Demo DevOpsBBVA Arquitectura - Demo DevOps
BBVA Arquitectura - Demo DevOpsErnesto Anaya
 
Introduccion a SQL Server 2017 en Docker
Introduccion a SQL Server 2017 en Docker Introduccion a SQL Server 2017 en Docker
Introduccion a SQL Server 2017 en Docker Eduardo Castro
 
Introduccion Power BI Report Server
Introduccion Power BI Report ServerIntroduccion Power BI Report Server
Introduccion Power BI Report ServerEduardo Castro
 
Automatización del despliegue de aplicaciones multi cloud
Automatización del despliegue de aplicaciones multi cloudAutomatización del despliegue de aplicaciones multi cloud
Automatización del despliegue de aplicaciones multi cloudSoftware Guru
 
Contenedores y el Futuro del Despliegue de Aplicaciones
Contenedores y el Futuro del Despliegue de AplicacionesContenedores y el Futuro del Despliegue de Aplicaciones
Contenedores y el Futuro del Despliegue de AplicacionesBitnami
 

La actualidad más candente (8)

BBVA Arquitectura - Demo DevOps
BBVA Arquitectura - Demo DevOpsBBVA Arquitectura - Demo DevOps
BBVA Arquitectura - Demo DevOps
 
Introduccion a SQL Server 2017 en Docker
Introduccion a SQL Server 2017 en Docker Introduccion a SQL Server 2017 en Docker
Introduccion a SQL Server 2017 en Docker
 
Introduccion Power BI Report Server
Introduccion Power BI Report ServerIntroduccion Power BI Report Server
Introduccion Power BI Report Server
 
Automatización del despliegue de aplicaciones multi cloud
Automatización del despliegue de aplicaciones multi cloudAutomatización del despliegue de aplicaciones multi cloud
Automatización del despliegue de aplicaciones multi cloud
 
Contenedores y el Futuro del Despliegue de Aplicaciones
Contenedores y el Futuro del Despliegue de AplicacionesContenedores y el Futuro del Despliegue de Aplicaciones
Contenedores y el Futuro del Despliegue de Aplicaciones
 
Webinar, entendiendo que es un VPS
Webinar, entendiendo que es un VPSWebinar, entendiendo que es un VPS
Webinar, entendiendo que es un VPS
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
 
De Mensajería hacia Logs con Apache Kafka
De Mensajería hacia Logs con Apache KafkaDe Mensajería hacia Logs con Apache Kafka
De Mensajería hacia Logs con Apache Kafka
 

Similar a Desymfony - Servicios

LenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptxLenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptxcarrilloja98
 
Introduction to Akamon software arquitecture for MPWAR
Introduction to Akamon software arquitecture for MPWARIntroduction to Akamon software arquitecture for MPWAR
Introduction to Akamon software arquitecture for MPWAREloi Poch
 
Derribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev DayDerribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev DayPlain Concepts
 
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...Francisco Javier Toscano Lopez
 
Cloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de KubernetesCloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de KubernetesDomingo Suarez Torres
 
Orquestación de Microservicios Introducción a arquitecturas de desarrollo mod...
Orquestación de Microservicios Introducción a arquitecturas de desarrollo mod...Orquestación de Microservicios Introducción a arquitecturas de desarrollo mod...
Orquestación de Microservicios Introducción a arquitecturas de desarrollo mod...ssuserc860fb
 
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPIntroducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPDaniel Primo
 
Comenzando con aplicaciones serverless en AWS
Comenzando con aplicaciones serverless en AWSComenzando con aplicaciones serverless en AWS
Comenzando con aplicaciones serverless en AWSAmazon Web Services LATAM
 
Symfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony FrameworkSymfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony Frameworkexcedesoft
 
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs Academy
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs AcademyBootCamp Online en DevOps (and SecDevOps) de GeeksHubs Academy
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs AcademyTelefónica
 
Automatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWSAutomatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWSAmazon Web Services LATAM
 
Mecanismos y patrones para acelerar adopción en arquitecturas de microservicios
Mecanismos y patrones para acelerar adopción en arquitecturas de microserviciosMecanismos y patrones para acelerar adopción en arquitecturas de microservicios
Mecanismos y patrones para acelerar adopción en arquitecturas de microserviciosSoftware Guru
 
.Net Conf UY 2017: Un paseo por Azure Service Fabric
.Net Conf UY 2017: Un paseo por Azure Service Fabric.Net Conf UY 2017: Un paseo por Azure Service Fabric
.Net Conf UY 2017: Un paseo por Azure Service FabricGuillermo Javier Bellmann
 
Symfony2 un framework para maximizar tu productividad en desarrollo web
Symfony2 un framework para maximizar tu productividad en desarrollo webSymfony2 un framework para maximizar tu productividad en desarrollo web
Symfony2 un framework para maximizar tu productividad en desarrollo webIEBSchool
 

Similar a Desymfony - Servicios (20)

LenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptxLenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptx
 
Introduction to Akamon software arquitecture for MPWAR
Introduction to Akamon software arquitecture for MPWARIntroduction to Akamon software arquitecture for MPWAR
Introduction to Akamon software arquitecture for MPWAR
 
Derribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev DayDerribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev Day
 
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
 
SGCE 2014 micro services
SGCE 2014 micro servicesSGCE 2014 micro services
SGCE 2014 micro services
 
Cloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de KubernetesCloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
 
Orquestación de Microservicios Introducción a arquitecturas de desarrollo mod...
Orquestación de Microservicios Introducción a arquitecturas de desarrollo mod...Orquestación de Microservicios Introducción a arquitecturas de desarrollo mod...
Orquestación de Microservicios Introducción a arquitecturas de desarrollo mod...
 
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPIntroducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
 
Gestión Remota de Equipos con Python
Gestión Remota de Equipos con PythonGestión Remota de Equipos con Python
Gestión Remota de Equipos con Python
 
SimpleSAMLphp
SimpleSAMLphpSimpleSAMLphp
SimpleSAMLphp
 
Introducción a microservicios
Introducción a microserviciosIntroducción a microservicios
Introducción a microservicios
 
Comenzando con aplicaciones serverless en AWS
Comenzando con aplicaciones serverless en AWSComenzando con aplicaciones serverless en AWS
Comenzando con aplicaciones serverless en AWS
 
Symfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony FrameworkSymfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony Framework
 
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs Academy
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs AcademyBootCamp Online en DevOps (and SecDevOps) de GeeksHubs Academy
BootCamp Online en DevOps (and SecDevOps) de GeeksHubs Academy
 
Automatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWSAutomatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWS
 
Mecanismos y patrones para acelerar adopción en arquitecturas de microservicios
Mecanismos y patrones para acelerar adopción en arquitecturas de microserviciosMecanismos y patrones para acelerar adopción en arquitecturas de microservicios
Mecanismos y patrones para acelerar adopción en arquitecturas de microservicios
 
.Net Conf UY 2017: Un paseo por Azure Service Fabric
.Net Conf UY 2017: Un paseo por Azure Service Fabric.Net Conf UY 2017: Un paseo por Azure Service Fabric
.Net Conf UY 2017: Un paseo por Azure Service Fabric
 
Symfony2 un framework para maximizar tu productividad en desarrollo web
Symfony2 un framework para maximizar tu productividad en desarrollo webSymfony2 un framework para maximizar tu productividad en desarrollo web
Symfony2 un framework para maximizar tu productividad en desarrollo web
 
M vs m
M vs mM vs m
M vs m
 
¿Que son los microservicios?
¿Que son los microservicios?¿Que son los microservicios?
¿Que son los microservicios?
 

Más de Ricard Clau

NoEresTanEspecial-PulpoCon22.pdf
NoEresTanEspecial-PulpoCon22.pdfNoEresTanEspecial-PulpoCon22.pdf
NoEresTanEspecial-PulpoCon22.pdfRicard Clau
 
DevOps & Infraestructura como código: Promesas Rotas
DevOps & Infraestructura como código: Promesas RotasDevOps & Infraestructura como código: Promesas Rotas
DevOps & Infraestructura como código: Promesas RotasRicard Clau
 
DevOps Barcelona Conference 2018 - Intro
DevOps Barcelona Conference 2018 - IntroDevOps Barcelona Conference 2018 - Intro
DevOps Barcelona Conference 2018 - IntroRicard Clau
 
Hashicorp at holaluz
Hashicorp at holaluzHashicorp at holaluz
Hashicorp at holaluzRicard Clau
 
What we talk about when we talk about DevOps
What we talk about when we talk about DevOpsWhat we talk about when we talk about DevOps
What we talk about when we talk about DevOpsRicard Clau
 
Building a bakery of Windows servers with Packer - London WinOps
Building a bakery of Windows servers with Packer - London WinOpsBuilding a bakery of Windows servers with Packer - London WinOps
Building a bakery of Windows servers with Packer - London WinOpsRicard Clau
 
Modern software architectures - PHP UK Conference 2015
Modern software architectures - PHP UK Conference 2015Modern software architectures - PHP UK Conference 2015
Modern software architectures - PHP UK Conference 2015Ricard Clau
 
Big Data! Great! Now What? #SymfonyCon 2014
Big Data! Great! Now What? #SymfonyCon 2014Big Data! Great! Now What? #SymfonyCon 2014
Big Data! Great! Now What? #SymfonyCon 2014Ricard Clau
 
Speed up your Symfony2 application and build awesome features with Redis
Speed up your Symfony2 application and build awesome features with RedisSpeed up your Symfony2 application and build awesome features with Redis
Speed up your Symfony2 application and build awesome features with RedisRicard Clau
 
Scaling with Symfony - PHP UK
Scaling with Symfony - PHP UKScaling with Symfony - PHP UK
Scaling with Symfony - PHP UKRicard Clau
 
Redis Everywhere - Sunshine PHP
Redis Everywhere - Sunshine PHPRedis Everywhere - Sunshine PHP
Redis Everywhere - Sunshine PHPRicard Clau
 
Redis everywhere - PHP London
Redis everywhere - PHP LondonRedis everywhere - PHP London
Redis everywhere - PHP LondonRicard Clau
 
Betabeers Barcelona - Buenas prácticas
Betabeers Barcelona - Buenas prácticasBetabeers Barcelona - Buenas prácticas
Betabeers Barcelona - Buenas prácticasRicard Clau
 

Más de Ricard Clau (15)

devopsbcn23.pdf
devopsbcn23.pdfdevopsbcn23.pdf
devopsbcn23.pdf
 
devopsbcn22.pdf
devopsbcn22.pdfdevopsbcn22.pdf
devopsbcn22.pdf
 
NoEresTanEspecial-PulpoCon22.pdf
NoEresTanEspecial-PulpoCon22.pdfNoEresTanEspecial-PulpoCon22.pdf
NoEresTanEspecial-PulpoCon22.pdf
 
DevOps & Infraestructura como código: Promesas Rotas
DevOps & Infraestructura como código: Promesas RotasDevOps & Infraestructura como código: Promesas Rotas
DevOps & Infraestructura como código: Promesas Rotas
 
DevOps Barcelona Conference 2018 - Intro
DevOps Barcelona Conference 2018 - IntroDevOps Barcelona Conference 2018 - Intro
DevOps Barcelona Conference 2018 - Intro
 
Hashicorp at holaluz
Hashicorp at holaluzHashicorp at holaluz
Hashicorp at holaluz
 
What we talk about when we talk about DevOps
What we talk about when we talk about DevOpsWhat we talk about when we talk about DevOps
What we talk about when we talk about DevOps
 
Building a bakery of Windows servers with Packer - London WinOps
Building a bakery of Windows servers with Packer - London WinOpsBuilding a bakery of Windows servers with Packer - London WinOps
Building a bakery of Windows servers with Packer - London WinOps
 
Modern software architectures - PHP UK Conference 2015
Modern software architectures - PHP UK Conference 2015Modern software architectures - PHP UK Conference 2015
Modern software architectures - PHP UK Conference 2015
 
Big Data! Great! Now What? #SymfonyCon 2014
Big Data! Great! Now What? #SymfonyCon 2014Big Data! Great! Now What? #SymfonyCon 2014
Big Data! Great! Now What? #SymfonyCon 2014
 
Speed up your Symfony2 application and build awesome features with Redis
Speed up your Symfony2 application and build awesome features with RedisSpeed up your Symfony2 application and build awesome features with Redis
Speed up your Symfony2 application and build awesome features with Redis
 
Scaling with Symfony - PHP UK
Scaling with Symfony - PHP UKScaling with Symfony - PHP UK
Scaling with Symfony - PHP UK
 
Redis Everywhere - Sunshine PHP
Redis Everywhere - Sunshine PHPRedis Everywhere - Sunshine PHP
Redis Everywhere - Sunshine PHP
 
Redis everywhere - PHP London
Redis everywhere - PHP LondonRedis everywhere - PHP London
Redis everywhere - PHP London
 
Betabeers Barcelona - Buenas prácticas
Betabeers Barcelona - Buenas prácticasBetabeers Barcelona - Buenas prácticas
Betabeers Barcelona - Buenas prácticas
 

Desymfony - Servicios

  • 1.
  • 2.
  • 3. Hello World • Ricard Clau Pintado • Trabajo en SocialPoint • Antes en Emagister, Ulabox y Privalia • Fundador Symfony-Barcelona • Blogger http://www.ricardclau.com • Twitter @ricardclau
  • 4. ¿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
  • 5. Arquitectura SOA Teoría y filosofía
  • 6. 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)
  • 7. 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!
  • 10. El modelo en Symfony2 Introducción a los servicios
  • 11. 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...
  • 12. 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!
  • 13. 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.
  • 14. Servicios en Symfony2 Ejemplos prácticos
  • 15. 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”
  • 16. Listado de servicios • php app/console container:debug
  • 17. ¿Qué tengo en el container? • https://github.com/Elao/WebProfilerExtraBundle
  • 18. Debug del container (I) • https://github.com/schmittjoh/JMSDebuggingBundle
  • 19. Debug del container (II) • https://github.com/schmittjoh/JMSDebuggingBundle
  • 22. Configurando la aplicación Carga de nodos y inyección al container
  • 23. 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
  • 24. [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
  • 25. Configuración compleja • Se inyecta bien pero no tenemos validación!
  • 26. Bundle complejo -> a validar! • Creamos los parámetros bajo la clave de nuestro bundle
  • 27. TreeBuilder • Creamos un TreeBuilder en una clase Configuration dentro de la carpeta DependencyInjection
  • 32. BundleExtension • Inyectamos la configuración en la Extension:
  • 33. Creación de servicios Inyección de dependencias
  • 34. Hello world Servicios • Servicio para recuperar información de Sensio Connect!
  • 35. Config y uso del servicio • En el config de la aplicación • Modificamos services.yml en Resources/config • Y desde el controller
  • 36. 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:
  • 37. Dependencias opcionales • Setter Injection y otras inicializaciones -> calls • Podemos combinarlo todo en servicios complejos
  • 39. Aplicaciones complejas Servicios parent, factories y tags
  • 41. Service Factories • El mejor ejemplo son los repositories • Pero si hacemos esto • Los controllers quedan así de limpios!
  • 42. 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
  • 43. Service Tags (II) • El componente Translator lo usa para los loaders • O cuando necesitamos crear un Event Listener
  • 44. 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
  • 45. Agradecimientos • A los Ulaboxers PHPeros: Sergi, Albert, Marc • Al equipo #rigor de @EmagisterTech • A la organización y sponsors de DeSymfony • A todos vosotros :)
  • 46. ¿Preguntas? • E-mail: ricard.clau@gmail.com • Twitter: @ricardclau • Github: https://github.com/ricardclau • O si os da corte ahora... en otro momento :)