KEMBAR78
DeSymfony 2017 - Symfony en OpenSky | PDF
Symfony @ OpenSky
Pablo Godel
DeSymfony 2017 - Castellón, Spain
Symfony @ OpenSky
¿Qué es OpenSky?
Symfony @ OpenSky
• Varios negocios corriendo Symfony:
opensky.com, dotandbo.com,
55mulberry.com
¿Qué es OpenSky?
Symfony @ OpenSky
• Varios negocios corriendo Symfony:
opensky.com, dotandbo.com,
55mulberry.com
• ~100 empleados
¿Qué es OpenSky?
Symfony @ OpenSky
• Varios negocios corriendo Symfony:
opensky.com, dotandbo.com,
55mulberry.com
• ~100 empleados
• Oficinas alrededor del mundo: New York,
Portland, Nashville, Miami, Chico,
Bucharest and Los Angeles
¿Qué es OpenSky?
Symfony @ OpenSky
HISTORIA
Symfony @ OpenSky
• Usuario temprano de Symfony2 en 2010
(anterior a 2.0 estable)
Historia
Symfony @ OpenSky
• Usuario temprano de Symfony2 en 2010
(anterior a 2.0 estable)
• Migración de Magento -> symfony1 ->
Symfony2
Historia
Symfony @ OpenSky
• Usuario temprano de Symfony2 en 2010
(anterior a 2.0 estable)
• Migración de Magento -> symfony1 ->
Symfony2
• Partes del carrito de Magento usados
durante el proceso de migración hasta ser
reemplazado completamente
Historia
Symfony @ OpenSky
Symfony @ OpenSky
Symfony @ OpenSky
PLATAFORMA ACTUAL
Symfony @ OpenSky
• Symfony 2.8
• RequireJS + Backbone
• PHP 7.0.12
• MySQL 5.6 + MongoDB 3.2
• Redis
• Varnish + Nginx
• VMWare
• Amazon AWS
Plataforma Actual
Symfony @ OpenSky
Plataforma Actual
Symfony @ OpenSky
X Redis
Plataforma Actual
Symfony @ OpenSky
FLUJO DE TRABAJO
Symfony @ OpenSky
Symfony at OpenSky
GitHub Enterprise
GitHub Enterprise
Flujo de Trabajo
Symfony @ OpenSky
• Rama production (master)
Flujo de Trabajo
Symfony @ OpenSky
• Rama production (master)
• Ramas feature / fix
Flujo de Trabajo
Symfony @ OpenSky
• Rama production (master)
• Ramas feature / fix
• Pull Requests relacionados con JIRA
Flujo de Trabajo
Symfony @ OpenSky
• Rama production (master)
• Ramas feature / fix
• Pull Requests relacionados con JIRA
• Integración con Jenkins para Tests
unitarios y funcionales
Flujo de Trabajo
Symfony @ OpenSky
• Rama production (master)
• Ramas feature / fix
• Pull Requests relacionados con JIRA
• Integración con Jenkins para Tests
unitarios y funcionales
• Hooks Pre-commit para php-cs-fixer,
gulp-jshint, gulp-sass-lint
Flujo de Trabajo
Symfony @ OpenSky
• Symfony Coding Standards
Flujo de Trabajo
Symfony @ OpenSky
• Symfony Coding Standards
• Short Array Syntax
Flujo de Trabajo
Symfony @ OpenSky
• Symfony Coding Standards
• Short Array Syntax
• Declaraciones de Use ordenados
Flujo de Trabajo
Symfony @ OpenSky
• Symfony Coding Standards
• Short Array Syntax
• Declaraciones de Use ordenados
• Asegurar un EOF al final del archivo
Flujo de Trabajo
Symfony @ OpenSky
• PHP7 Type-Hints lo más posible
Flujo de Trabajo
Symfony @ OpenSky
• PHP7 Type-Hints lo más posible
• DocBlocks sólo cuando agrega valor/claridad
Flujo de Trabajo
Symfony @ OpenSky
• PHP7 Type-Hints lo más posible
• DocBlocks sólo cuando agrega valor/claridad
• ClassName::class
Flujo de Trabajo
Symfony @ OpenSky
• PHP7 Type-Hints lo más posible
• DocBlocks sólo cuando agrega valor/claridad
• ClassName::class
• ‘NamespaceClassName’
Flujo de Trabajo
Symfony @ OpenSky
• PHP7 Type-Hints lo más posible
• DocBlocks sólo cuando agrega valor/claridad
• ClassName::class
• ‘NamespaceClassName’
• Incluidos en los forms
Flujo de Trabajo
Symfony @ OpenSky
• PHP7 Type-Hints lo más posible
• DocBlocks sólo cuando agrega valor/claridad
• ClassName::class
• ‘NamespaceClassName’
• Incluidos en los forms
• $builder->add('name', TextType::class);
Flujo de Trabajo
Symfony @ OpenSky
• PHP7 Type-Hints lo más posible
• DocBlocks sólo cuando agrega valor/claridad
• ClassName::class
• ‘NamespaceClassName’
• Incluidos en los forms
• $builder->add('name', TextType::class);
• Siempre usar la declaración de ‘use’
Flujo de Trabajo
Symfony @ OpenSky
• PHP7 Type-Hints lo más posible
• DocBlocks sólo cuando agrega valor/claridad
• ClassName::class
• ‘NamespaceClassName’
• Incluidos en los forms
• $builder->add('name', TextType::class);
• Siempre usar la declaración de ‘use’
• $time = new DateTime()
Flujo de Trabajo
Symfony @ OpenSky
Antes del deployment de producción:
Flujo de Trabajo
Symfony @ OpenSky
Antes del deployment de producción:
• Peer Reviews
Flujo de Trabajo
Symfony @ OpenSky
Antes del deployment de producción:
• Peer Reviews
• 100% test pass (unit & funcional)
Flujo de Trabajo
Symfony @ OpenSky
Antes del deployment de producción:
• Peer Reviews
• 100% test pass (unit & funcional)
• Deploy y Testing de Integración
Flujo de Trabajo
Symfony @ OpenSky
Antes del deployment de producción:
• Peer Reviews
• 100% test pass (unit & funcional)
• Deploy y Testing de Integración
• UA / QA pass (registrado en JIRA)
Flujo de Trabajo
Symfony @ OpenSky
BUNDLES de SYMFONY
Symfony @ OpenSky
• Separar en bundles generales. No abusar.
Bundles de Symfony
Symfony @ OpenSky
• Separar en bundles generales. No abusar.
• MainBundle
Bundles de Symfony
Symfony @ OpenSky
• Separar en bundles generales. No abusar.
• MainBundle
• AdminBundle (500+ rutas, 300 servicios
extra en el container)
Bundles de Symfony
Symfony @ OpenSky
• Separar en bundles generales. No abusar.
• MainBundle
• AdminBundle (500+ rutas, 300 servicios
extra en el container)
• APIBundle
Bundles de Symfony
Symfony @ OpenSky
• Separar en bundles generales. No abusar.
• MainBundle
• AdminBundle (500+ rutas, 300 servicios
extra en el container)
• APIBundle
• Bundles de terceros
Bundles de Symfony
Symfony @ OpenSky
• Separar en bundles generales. No abusar.
• MainBundle
• AdminBundle (500+ rutas, 300 servicios
extra en el container)
• APIBundle
• Bundles de terceros
• AvalancheImagineBundle
Bundles de Symfony
Symfony @ OpenSky
• Separar en bundles generales. No abusar.
• MainBundle
• AdminBundle (500+ rutas, 300 servicios
extra en el container)
• APIBundle
• Bundles de terceros
• AvalancheImagineBundle
• FOSUserBundle
Bundles de Symfony
Symfony @ OpenSky
• Separar en bundles generales. No abusar.
• MainBundle
• AdminBundle (500+ rutas, 300 servicios
extra en el container)
• APIBundle
• Bundles de terceros
• AvalancheImagineBundle
• FOSUserBundle
• Alerta! Usar bundles de terceros puede
afectar el mantenimiento a largo plazo
Bundles de Symfony
Symfony @ OpenSky
SYMFONY APPS
Symfony @ OpenSky
• 3 Apps
Symfony Apps
Symfony @ OpenSky
• 3 Apps
• opensky
• admin
• api
Symfony Apps
Symfony @ OpenSky
• 3 Apps
• opensky
• admin
• api
• Acotar rutas, servicios, bundles
Symfony Apps
Symfony @ OpenSky
• 3 Apps
• opensky
• admin
• api
• Acotar rutas, servicios, bundles
• opensky -> MainBundle
• admin -> MainBundle, AdminBundle
• api -> MainBundle, ApiBundle
Symfony Apps
Symfony @ OpenSky
DOCTRINE
Symfony @ OpenSky
• MongoDB y MySQL juntos
Doctrine
Symfony @ OpenSky
• MongoDB y MySQL juntos
• Referencias entre MongoDB y MySQL
Doctrine
Symfony @ OpenSky
• MongoDB y MySQL juntos
• Referencias entre MongoDB y MySQL
• Usar Doctrine ORM & MongoDB ODM para los
modelos de datos entre los dos sistemas,
transparente al core
Doctrine
Symfony @ OpenSky
• MongoDB y MySQL juntos
• Referencias entre MongoDB y MySQL
• Usar Doctrine ORM & MongoDB ODM para los
modelos de datos entre los dos sistemas,
transparente al core
• Nunca borrar datos para evitar problemas de
integridad referencial. Usar soft delete
(deletedAt)
Doctrine
Symfony @ OpenSky
• MongoDB y MySQL juntos
• Referencias entre MongoDB y MySQL
• Usar Doctrine ORM & MongoDB ODM para los
modelos de datos entre los dos sistemas,
transparente al core
• Nunca borrar datos para evitar problemas de
integridad referencial. Usar soft delete
(deletedAt)
• Traits para funcionalidad común como
createdAt/updatedAt
Doctrine
Symfony @ OpenSky
Symfony @ OpenSky
Symfony @ OpenSky
Algunas consideraciones:
Migraciones con Doctrine
Symfony @ OpenSky
• ¿Cuánto dura ejecutarlas?
Migraciones con Doctrine
Symfony @ OpenSky
• ¿Cuánto dura ejecutarlas?
• ¿Es compatible hacia atrás?
Migraciones con Doctrine
Symfony @ OpenSky
• ¿Cuánto dura ejecutarlas?
• ¿Es compatible hacia atrás?
• Up & Down
Migraciones con Doctrine
Symfony @ OpenSky
• ¿Cuánto dura ejecutarlas?
• ¿Es compatible hacia atrás?
• Up & Down
• schema.sql / data.sql
actualizados
Migraciones con Doctrine
Symfony @ OpenSky
• ¿Cuánto dura ejecutarlas?
• ¿Es compatible hacia atrás?
• Up & Down
• schema.sql / data.sql
actualizados
• Agregar indexes
Migraciones con Doctrine
Symfony @ OpenSky
+SYMFONY
Symfony @ OpenSky
• Livianos
Controladores
Symfony @ OpenSky
• Livianos
• Excluir lógica de negocios
Controladores
Symfony @ OpenSky
• Livianos
• Excluir lógica de negocios
• Sólo flujo de control
Controladores
Symfony @ OpenSky
• Livianos
• Excluir lógica de negocios
• Sólo flujo de control
• Extender de un BaseController
Controladores
Symfony @ OpenSky
• Dos niveles de autenticación implementado con role
voters
Seguridad
Symfony @ OpenSky
• Dos niveles de autenticación implementado con role
voters
• PartiallyAuthenticatedVoter
• AuthenticatedRecentlyVoter
Seguridad
Symfony @ OpenSky
• Dos niveles de autenticación implementado con role
voters
• PartiallyAuthenticatedVoter
• AuthenticatedRecentlyVoter
• Cuando un usuario es autenticado recientemente
entra en el segundo nivel y tienen acceso a cuenta,
checkout, etc. Luego de 15 minutos de inactividad es
sacado del segundo nivel
Seguridad
Symfony @ OpenSky
• Dos niveles de autenticación implementado con role
voters
• PartiallyAuthenticatedVoter
• AuthenticatedRecentlyVoter
• Cuando un usuario es autenticado recientemente
entra en el segundo nivel y tienen acceso a cuenta,
checkout, etc. Luego de 15 minutos de inactividad es
sacado del segundo nivel
• Admin integrado con LDAP (con zendframework/
zend-ldap)
Seguridad
Symfony @ OpenSky
• Dos niveles de autenticación implementado con role
voters
• PartiallyAuthenticatedVoter
• AuthenticatedRecentlyVoter
• Cuando un usuario es autenticado recientemente
entra en el segundo nivel y tienen acceso a cuenta,
checkout, etc. Luego de 15 minutos de inactividad es
sacado del segundo nivel
• Admin integrado con LDAP (con zendframework/
zend-ldap)
• firewalls/authentication providers distintos para
consumidores, admin y api
Seguridad
Symfony @ OpenSky
Runtime Settings/Parameters
• Parámetros definidos en config/parameters.yml
Symfony @ OpenSky
Runtime Settings/Parameters
• Parámetros definidos en config/parameters.yml
• Cambios guardados en MongoDB
Symfony @ OpenSky
Runtime Settings/Parameters
• Parámetros definidos en config/parameters.yml
• Cambios guardados en MongoDB
• Permite cambios de configuración sin
deployment
Symfony @ OpenSky
Runtime Settings/Parameters
• Parámetros definidos en config/parameters.yml
• Cambios guardados en MongoDB
• Permite cambios de configuración sin
deployment
• Parámetros pueden tener fecha de comienzo &
fin
Symfony @ OpenSky
Runtime Settings/Parameters
• Parámetros definidos en config/parameters.yml
• Cambios guardados en MongoDB
• Permite cambios de configuración sin
deployment
• Parámetros pueden tener fecha de comienzo &
fin
• Todos los parámetros presentes en cache
Symfony @ OpenSky
Runtime Settings/Parameters
• Parámetros definidos en config/parameters.yml
• Cambios guardados en MongoDB
• Permite cambios de configuración sin
deployment
• Parámetros pueden tener fecha de comienzo &
fin
• Todos los parámetros presentes en cache
• Con cambio de valor, cache es actualizado y
procesos de cola reiniciados
Symfony @ OpenSky
Runtime Settings/Parameters
• Parámetros definidos en config/parameters.yml
• Cambios guardados en MongoDB
• Permite cambios de configuración sin
deployment
• Parámetros pueden tener fecha de comienzo &
fin
• Todos los parámetros presentes en cache
• Con cambio de valor, cache es actualizado y
procesos de cola reiniciados
• Muy usado para activar/desactivar nueva/vieja
funcionalidad
Symfony @ OpenSky
Runtime Settings/Parameters
Symfony @ OpenSky
Runtime Settings/Parameters
Symfony @ OpenSky
Runtime Settings/Parameters
Dev/Testing: production.flag = false
Production: production.flag = true
Symfony @ OpenSky
EVENTOS
Symfony @ OpenSky
• Realizar tareas luego de enviar la respuesta al
cliente
Evento kernel.terminate
Symfony @ OpenSky
• Realizar tareas luego de enviar la respuesta al
cliente
• Guardar Request Log en MongoDB
Evento kernel.terminate
Symfony @ OpenSky
• Realizar tareas luego de enviar la respuesta al
cliente
• Guardar Request Log en MongoDB
• Analizar petición para acciones adicionales
Evento kernel.terminate
Symfony @ OpenSky
• Realizar tareas luego de enviar la respuesta al
cliente
• Guardar Request Log en MongoDB
• Analizar petición para acciones adicionales
• Sólo efectivo con FastCGI
Evento kernel.terminate
Symfony @ OpenSky
• Encolar eventos para funcionalidad
asíncrona
Sistema de Eventos
Symfony @ OpenSky
• Encolar eventos para funcionalidad
asíncrona
• Serializador/Deserializador de eventos
Sistema de Eventos
Symfony @ OpenSky
• Encolar eventos para funcionalidad
asíncrona
• Serializador/Deserializador de eventos
• Eventos programados a futuro
Sistema de Eventos
Symfony @ OpenSky
• Encolar eventos para funcionalidad
asíncrona
• Serializador/Deserializador de eventos
• Eventos programados a futuro
• Multiples intentos
Sistema de Eventos
Symfony @ OpenSky
• Encolar eventos para funcionalidad
asíncrona
• Serializador/Deserializador de eventos
• Eventos programados a futuro
• Multiples intentos
• Una cola por collection de mongodb
Sistema de Eventos
Symfony @ OpenSky
• Encolar eventos para funcionalidad
asíncrona
• Serializador/Deserializador de eventos
• Eventos programados a futuro
• Multiples intentos
• Una cola por collection de mongodb
• Consumidores de cola manejados con
Supervisord
Sistema de Eventos
Symfony @ OpenSky
Sistema de Eventos
Symfony @ OpenSky
Sistema de Eventos
Symfony @ OpenSky
Sistema de Eventos
Symfony @ OpenSky
Sistema de Eventos
Symfony @ OpenSky
Sistema de Eventos
Symfony @ OpenSky
SLACK
Symfony @ OpenSky
• php-kip usando yabot
Integración con Slack
Symfony @ OpenSky
• php-kip usando yabot
• Manejo de línea de deploy de
producción
Integración con Slack
Symfony @ OpenSky
• php-kip usando yabot
• Manejo de línea de deploy de
producción
• Reservaciones y deploys de entornos
de integración
Integración con Slack
Symfony @ OpenSky
• php-kip usando yabot
• Manejo de línea de deploy de
producción
• Reservaciones y deploys de entornos
de integración
• Notificaciones desde Symfony
Integración con Slack
Symfony @ OpenSky
Symfony at OpenSky
Php-kip using yubot
- Production deploy queue/line
- Dev environment deploys
Integración con Slack
Symfony @ OpenSky
Symfony at OpenSky
Php-kip using yubot
- Production deploy queue/line
- Dev environment deploys
Integración con Slack
Symfony @ OpenSky
Symfony at OpenSky
Php-kip using yubot
- Production deploy queue/line
- Dev environment deploys
Integración con Slack
Symfony @ OpenSky
Integración con Slack
Symfony @ OpenSky
Integración con Slack
Symfony @ OpenSky
Integración con Slack
Symfony @ OpenSky
SEARCH
Symfony @ OpenSky
Search
• Integración con Algolia
Symfony @ OpenSky
Search
• Integración con Algolia
• algolia/algoliasearch-client-php
Symfony @ OpenSky
Search
• Integración con Algolia
• algolia/algoliasearch-client-php
• Actualización de index con Event Listeners
Symfony @ OpenSky
Pagos
• Integración con Braintree Payments
• braintree/braintree_php
Symfony @ OpenSky
• NPM
• jQuery
• RequireJS
• Backbone
• TwigJS
• Gulp / Less / Sass
El Frontend
Symfony @ OpenSky
TESTING
Symfony @ OpenSky
• pr-nightmare
Testing
Symfony @ OpenSky
• pr-nightmare
• Corre en todos los commits y pull requests
Testing
Symfony @ OpenSky
• pr-nightmare
• Corre en todos los commits y pull requests
• Usa PHPChunkit para ejecutar 30 minutos de
tests en 3 minutos corriendo grupos de tests
en paralelo distribuidos en varios servidores

https://github.com/jwage/phpchunkit
Testing
Symfony @ OpenSky
Testing
Symfony @ OpenSky
• Anotación ‘@app admin’ para indicar que app/
kernel usar en el web test case
Testing con PHPUnit
Symfony @ OpenSky
• Anotación ‘@app admin’ para indicar que app/
kernel usar en el web test case
• AutoDataCleanupListener automáticamente
monitorea las colecciones y tablas donde
insertamos datos para luego limpiarlas
Testing con PHPUnit
Symfony @ OpenSky
• Anotación ‘@app admin’ para indicar que app/
kernel usar en el web test case
• AutoDataCleanupListener automáticamente
monitorea las colecciones y tablas donde
insertamos datos para luego limpiarlas
• AbstractTwigLintTest: Twig linting. Carga y
chequea todos los archivos Twig para errores de
sintaxis
Testing con PHPUnit
Symfony @ OpenSky
• Anotación ‘@app admin’ para indicar que app/
kernel usar en el web test case
• AutoDataCleanupListener automáticamente
monitorea las colecciones y tablas donde
insertamos datos para luego limpiarlas
• AbstractTwigLintTest: Twig linting. Carga y
chequea todos los archivos Twig para errores de
sintaxis
• Comando para generar archivos de definición de
tests basado en las clases PHP
Testing con PHPUnit
Symfony @ OpenSky
• Anotación ‘@app admin’ para indicar que app/
kernel usar en el web test case
• AutoDataCleanupListener automáticamente
monitorea las colecciones y tablas donde
insertamos datos para luego limpiarlas
• AbstractTwigLintTest: Twig linting. Carga y
chequea todos los archivos Twig para errores de
sintaxis
• Comando para generar archivos de definición de
tests basado en las clases PHP
• Comando para PHPUnit watch
Testing con PHPUnit
Symfony @ OpenSky
Testing con PHPUnit
Symfony @ OpenSky
• Correr con PHP 7
Testing con PHPUnit
Symfony @ OpenSky
• Correr con PHP 7
• Deshabilitar XDebug
Testing con PHPUnit
Symfony @ OpenSky
• Correr con PHP 7
• Deshabilitar XDebug
• Crear Mocks
Testing con PHPUnit
Symfony @ OpenSky
PHPUnit watch
Symfony @ OpenSky
PHPUnit watch
Symfony @ OpenSky
PHPUnit watch
Symfony @ OpenSky
PHPUnit watch
Symfony @ OpenSky
Twig Lint con PHPUnit
Symfony @ OpenSky
Twig Lint con PHPUnit
Symfony @ OpenSky
Twig Lint con PHPUnit
Symfony @ OpenSky
DEPLOYMENT
Symfony @ OpenSky
Deployment
• Fabric extendido
Symfony @ OpenSky
Deployment
• Fabric extendido
• Iniciado manualmente desde Jenkins
Symfony @ OpenSky
Deployment
• Fabric extendido
• Iniciado manualmente desde Jenkins
• Primera tarea de build
Symfony @ OpenSky
Deployment
• Fabric extendido
• Iniciado manualmente desde Jenkins
• Primera tarea de build
• Merge rama feature/fix a master
• Crea Tag
Symfony @ OpenSky
Deployment
• Fabric extendido
• Iniciado manualmente desde Jenkins
• Primera tarea de build
• Merge rama feature/fix a master
• Crea Tag
• Segunda tarea de build
Symfony @ OpenSky
Deployment
• Fabric extendido
• Iniciado manualmente desde Jenkins
• Primera tarea de build
• Merge rama feature/fix a master
• Crea Tag
• Segunda tarea de build
• git checkout
• composer install --no-dev —no-scripts
• Genera front controller
• Corre gulp, requires, less, sass
• Warmup cache para cada app
• Assetic dump
• Crea archivo de artifacts & distribuye a los servidores
• Corre migraciones de MySQL & MongoDB
• Rota logs
• Reinicia php-fpm
• Recarga Varnish and nginx
• Reinicia queue workers
Symfony @ OpenSky
¿Qué sigue?
Symfony @ OpenSky
¿Qué sigue?
• Actualizar a Symfony 3
Symfony @ OpenSky
• Actualizar a Symfony 3
• Crear aplicaciones adicionales para mejorar
rendimiento de areas específicas
¿Qué sigue?
Symfony @ OpenSky
• Actualizar a Symfony 3
• Crear aplicaciones adicionales para mejorar
rendimiento de areas específicas
• Actualizar el frontend utilizando un stack más
moderno
¿Qué sigue?
Symfony @ OpenSky
• Actualizar a Symfony 3
• Crear aplicaciones adicionales para mejorar
rendimiento de areas específicas
• Actualizar el frontend utilizando un stack más
moderno
• Retirar Assetic
¿Qué sigue?
Symfony @ OpenSky
• Actualizar a Symfony 3
• Crear aplicaciones adicionales para mejorar
rendimiento de areas específicas
• Actualizar el frontend utilizando un stack más
moderno
• Retirar Assetic
• Incrementar los tests funcionales
¿Qué sigue?
Symfony @ OpenSky
• Actualizar a Symfony 3
• Crear aplicaciones adicionales para mejorar
rendimiento de areas específicas
• Actualizar el frontend utilizando un stack más
moderno
• Retirar Assetic
• Incrementar los tests funcionales
• Usar RabbitMQ
¿Qué sigue?
Symfony @ OpenSky
• Actualizar a Symfony 3
• Crear aplicaciones adicionales para mejorar
rendimiento de areas específicas
• Actualizar el frontend utilizando un stack más
moderno
• Retirar Assetic
• Incrementar los tests funcionales
• Usar RabbitMQ
• Muchas cosas más
¿Qué sigue?
Symfony @ OpenSky
¿Preguntas?
Symfony @ OpenSky
¡Muchas gracias!
@pgodel
http://slideshare.net/pgodel

DeSymfony 2017 - Symfony en OpenSky

  • 1.
    Symfony @ OpenSky PabloGodel DeSymfony 2017 - Castellón, Spain
  • 3.
  • 4.
    Symfony @ OpenSky •Varios negocios corriendo Symfony: opensky.com, dotandbo.com, 55mulberry.com ¿Qué es OpenSky?
  • 5.
    Symfony @ OpenSky •Varios negocios corriendo Symfony: opensky.com, dotandbo.com, 55mulberry.com • ~100 empleados ¿Qué es OpenSky?
  • 6.
    Symfony @ OpenSky •Varios negocios corriendo Symfony: opensky.com, dotandbo.com, 55mulberry.com • ~100 empleados • Oficinas alrededor del mundo: New York, Portland, Nashville, Miami, Chico, Bucharest and Los Angeles ¿Qué es OpenSky?
  • 7.
  • 8.
    Symfony @ OpenSky •Usuario temprano de Symfony2 en 2010 (anterior a 2.0 estable) Historia
  • 9.
    Symfony @ OpenSky •Usuario temprano de Symfony2 en 2010 (anterior a 2.0 estable) • Migración de Magento -> symfony1 -> Symfony2 Historia
  • 10.
    Symfony @ OpenSky •Usuario temprano de Symfony2 en 2010 (anterior a 2.0 estable) • Migración de Magento -> symfony1 -> Symfony2 • Partes del carrito de Magento usados durante el proceso de migración hasta ser reemplazado completamente Historia
  • 11.
  • 12.
  • 13.
  • 14.
    Symfony @ OpenSky •Symfony 2.8 • RequireJS + Backbone • PHP 7.0.12 • MySQL 5.6 + MongoDB 3.2 • Redis • Varnish + Nginx • VMWare • Amazon AWS Plataforma Actual
  • 15.
  • 16.
    Symfony @ OpenSky XRedis Plataforma Actual
  • 17.
  • 18.
    Symfony @ OpenSky Symfonyat OpenSky GitHub Enterprise GitHub Enterprise Flujo de Trabajo
  • 19.
    Symfony @ OpenSky •Rama production (master) Flujo de Trabajo
  • 20.
    Symfony @ OpenSky •Rama production (master) • Ramas feature / fix Flujo de Trabajo
  • 21.
    Symfony @ OpenSky •Rama production (master) • Ramas feature / fix • Pull Requests relacionados con JIRA Flujo de Trabajo
  • 22.
    Symfony @ OpenSky •Rama production (master) • Ramas feature / fix • Pull Requests relacionados con JIRA • Integración con Jenkins para Tests unitarios y funcionales Flujo de Trabajo
  • 23.
    Symfony @ OpenSky •Rama production (master) • Ramas feature / fix • Pull Requests relacionados con JIRA • Integración con Jenkins para Tests unitarios y funcionales • Hooks Pre-commit para php-cs-fixer, gulp-jshint, gulp-sass-lint Flujo de Trabajo
  • 24.
    Symfony @ OpenSky •Symfony Coding Standards Flujo de Trabajo
  • 25.
    Symfony @ OpenSky •Symfony Coding Standards • Short Array Syntax Flujo de Trabajo
  • 26.
    Symfony @ OpenSky •Symfony Coding Standards • Short Array Syntax • Declaraciones de Use ordenados Flujo de Trabajo
  • 27.
    Symfony @ OpenSky •Symfony Coding Standards • Short Array Syntax • Declaraciones de Use ordenados • Asegurar un EOF al final del archivo Flujo de Trabajo
  • 28.
    Symfony @ OpenSky •PHP7 Type-Hints lo más posible Flujo de Trabajo
  • 29.
    Symfony @ OpenSky •PHP7 Type-Hints lo más posible • DocBlocks sólo cuando agrega valor/claridad Flujo de Trabajo
  • 30.
    Symfony @ OpenSky •PHP7 Type-Hints lo más posible • DocBlocks sólo cuando agrega valor/claridad • ClassName::class Flujo de Trabajo
  • 31.
    Symfony @ OpenSky •PHP7 Type-Hints lo más posible • DocBlocks sólo cuando agrega valor/claridad • ClassName::class • ‘NamespaceClassName’ Flujo de Trabajo
  • 32.
    Symfony @ OpenSky •PHP7 Type-Hints lo más posible • DocBlocks sólo cuando agrega valor/claridad • ClassName::class • ‘NamespaceClassName’ • Incluidos en los forms Flujo de Trabajo
  • 33.
    Symfony @ OpenSky •PHP7 Type-Hints lo más posible • DocBlocks sólo cuando agrega valor/claridad • ClassName::class • ‘NamespaceClassName’ • Incluidos en los forms • $builder->add('name', TextType::class); Flujo de Trabajo
  • 34.
    Symfony @ OpenSky •PHP7 Type-Hints lo más posible • DocBlocks sólo cuando agrega valor/claridad • ClassName::class • ‘NamespaceClassName’ • Incluidos en los forms • $builder->add('name', TextType::class); • Siempre usar la declaración de ‘use’ Flujo de Trabajo
  • 35.
    Symfony @ OpenSky •PHP7 Type-Hints lo más posible • DocBlocks sólo cuando agrega valor/claridad • ClassName::class • ‘NamespaceClassName’ • Incluidos en los forms • $builder->add('name', TextType::class); • Siempre usar la declaración de ‘use’ • $time = new DateTime() Flujo de Trabajo
  • 36.
    Symfony @ OpenSky Antesdel deployment de producción: Flujo de Trabajo
  • 37.
    Symfony @ OpenSky Antesdel deployment de producción: • Peer Reviews Flujo de Trabajo
  • 38.
    Symfony @ OpenSky Antesdel deployment de producción: • Peer Reviews • 100% test pass (unit & funcional) Flujo de Trabajo
  • 39.
    Symfony @ OpenSky Antesdel deployment de producción: • Peer Reviews • 100% test pass (unit & funcional) • Deploy y Testing de Integración Flujo de Trabajo
  • 40.
    Symfony @ OpenSky Antesdel deployment de producción: • Peer Reviews • 100% test pass (unit & funcional) • Deploy y Testing de Integración • UA / QA pass (registrado en JIRA) Flujo de Trabajo
  • 41.
  • 42.
    Symfony @ OpenSky •Separar en bundles generales. No abusar. Bundles de Symfony
  • 43.
    Symfony @ OpenSky •Separar en bundles generales. No abusar. • MainBundle Bundles de Symfony
  • 44.
    Symfony @ OpenSky •Separar en bundles generales. No abusar. • MainBundle • AdminBundle (500+ rutas, 300 servicios extra en el container) Bundles de Symfony
  • 45.
    Symfony @ OpenSky •Separar en bundles generales. No abusar. • MainBundle • AdminBundle (500+ rutas, 300 servicios extra en el container) • APIBundle Bundles de Symfony
  • 46.
    Symfony @ OpenSky •Separar en bundles generales. No abusar. • MainBundle • AdminBundle (500+ rutas, 300 servicios extra en el container) • APIBundle • Bundles de terceros Bundles de Symfony
  • 47.
    Symfony @ OpenSky •Separar en bundles generales. No abusar. • MainBundle • AdminBundle (500+ rutas, 300 servicios extra en el container) • APIBundle • Bundles de terceros • AvalancheImagineBundle Bundles de Symfony
  • 48.
    Symfony @ OpenSky •Separar en bundles generales. No abusar. • MainBundle • AdminBundle (500+ rutas, 300 servicios extra en el container) • APIBundle • Bundles de terceros • AvalancheImagineBundle • FOSUserBundle Bundles de Symfony
  • 49.
    Symfony @ OpenSky •Separar en bundles generales. No abusar. • MainBundle • AdminBundle (500+ rutas, 300 servicios extra en el container) • APIBundle • Bundles de terceros • AvalancheImagineBundle • FOSUserBundle • Alerta! Usar bundles de terceros puede afectar el mantenimiento a largo plazo Bundles de Symfony
  • 50.
  • 51.
    Symfony @ OpenSky •3 Apps Symfony Apps
  • 52.
    Symfony @ OpenSky •3 Apps • opensky • admin • api Symfony Apps
  • 53.
    Symfony @ OpenSky •3 Apps • opensky • admin • api • Acotar rutas, servicios, bundles Symfony Apps
  • 54.
    Symfony @ OpenSky •3 Apps • opensky • admin • api • Acotar rutas, servicios, bundles • opensky -> MainBundle • admin -> MainBundle, AdminBundle • api -> MainBundle, ApiBundle Symfony Apps
  • 55.
  • 56.
    Symfony @ OpenSky •MongoDB y MySQL juntos Doctrine
  • 57.
    Symfony @ OpenSky •MongoDB y MySQL juntos • Referencias entre MongoDB y MySQL Doctrine
  • 58.
    Symfony @ OpenSky •MongoDB y MySQL juntos • Referencias entre MongoDB y MySQL • Usar Doctrine ORM & MongoDB ODM para los modelos de datos entre los dos sistemas, transparente al core Doctrine
  • 59.
    Symfony @ OpenSky •MongoDB y MySQL juntos • Referencias entre MongoDB y MySQL • Usar Doctrine ORM & MongoDB ODM para los modelos de datos entre los dos sistemas, transparente al core • Nunca borrar datos para evitar problemas de integridad referencial. Usar soft delete (deletedAt) Doctrine
  • 60.
    Symfony @ OpenSky •MongoDB y MySQL juntos • Referencias entre MongoDB y MySQL • Usar Doctrine ORM & MongoDB ODM para los modelos de datos entre los dos sistemas, transparente al core • Nunca borrar datos para evitar problemas de integridad referencial. Usar soft delete (deletedAt) • Traits para funcionalidad común como createdAt/updatedAt Doctrine
  • 61.
  • 62.
  • 63.
    Symfony @ OpenSky Algunasconsideraciones: Migraciones con Doctrine
  • 64.
    Symfony @ OpenSky •¿Cuánto dura ejecutarlas? Migraciones con Doctrine
  • 65.
    Symfony @ OpenSky •¿Cuánto dura ejecutarlas? • ¿Es compatible hacia atrás? Migraciones con Doctrine
  • 66.
    Symfony @ OpenSky •¿Cuánto dura ejecutarlas? • ¿Es compatible hacia atrás? • Up & Down Migraciones con Doctrine
  • 67.
    Symfony @ OpenSky •¿Cuánto dura ejecutarlas? • ¿Es compatible hacia atrás? • Up & Down • schema.sql / data.sql actualizados Migraciones con Doctrine
  • 68.
    Symfony @ OpenSky •¿Cuánto dura ejecutarlas? • ¿Es compatible hacia atrás? • Up & Down • schema.sql / data.sql actualizados • Agregar indexes Migraciones con Doctrine
  • 69.
  • 70.
    Symfony @ OpenSky •Livianos Controladores
  • 71.
    Symfony @ OpenSky •Livianos • Excluir lógica de negocios Controladores
  • 72.
    Symfony @ OpenSky •Livianos • Excluir lógica de negocios • Sólo flujo de control Controladores
  • 73.
    Symfony @ OpenSky •Livianos • Excluir lógica de negocios • Sólo flujo de control • Extender de un BaseController Controladores
  • 74.
    Symfony @ OpenSky •Dos niveles de autenticación implementado con role voters Seguridad
  • 75.
    Symfony @ OpenSky •Dos niveles de autenticación implementado con role voters • PartiallyAuthenticatedVoter • AuthenticatedRecentlyVoter Seguridad
  • 76.
    Symfony @ OpenSky •Dos niveles de autenticación implementado con role voters • PartiallyAuthenticatedVoter • AuthenticatedRecentlyVoter • Cuando un usuario es autenticado recientemente entra en el segundo nivel y tienen acceso a cuenta, checkout, etc. Luego de 15 minutos de inactividad es sacado del segundo nivel Seguridad
  • 77.
    Symfony @ OpenSky •Dos niveles de autenticación implementado con role voters • PartiallyAuthenticatedVoter • AuthenticatedRecentlyVoter • Cuando un usuario es autenticado recientemente entra en el segundo nivel y tienen acceso a cuenta, checkout, etc. Luego de 15 minutos de inactividad es sacado del segundo nivel • Admin integrado con LDAP (con zendframework/ zend-ldap) Seguridad
  • 78.
    Symfony @ OpenSky •Dos niveles de autenticación implementado con role voters • PartiallyAuthenticatedVoter • AuthenticatedRecentlyVoter • Cuando un usuario es autenticado recientemente entra en el segundo nivel y tienen acceso a cuenta, checkout, etc. Luego de 15 minutos de inactividad es sacado del segundo nivel • Admin integrado con LDAP (con zendframework/ zend-ldap) • firewalls/authentication providers distintos para consumidores, admin y api Seguridad
  • 79.
    Symfony @ OpenSky RuntimeSettings/Parameters • Parámetros definidos en config/parameters.yml
  • 80.
    Symfony @ OpenSky RuntimeSettings/Parameters • Parámetros definidos en config/parameters.yml • Cambios guardados en MongoDB
  • 81.
    Symfony @ OpenSky RuntimeSettings/Parameters • Parámetros definidos en config/parameters.yml • Cambios guardados en MongoDB • Permite cambios de configuración sin deployment
  • 82.
    Symfony @ OpenSky RuntimeSettings/Parameters • Parámetros definidos en config/parameters.yml • Cambios guardados en MongoDB • Permite cambios de configuración sin deployment • Parámetros pueden tener fecha de comienzo & fin
  • 83.
    Symfony @ OpenSky RuntimeSettings/Parameters • Parámetros definidos en config/parameters.yml • Cambios guardados en MongoDB • Permite cambios de configuración sin deployment • Parámetros pueden tener fecha de comienzo & fin • Todos los parámetros presentes en cache
  • 84.
    Symfony @ OpenSky RuntimeSettings/Parameters • Parámetros definidos en config/parameters.yml • Cambios guardados en MongoDB • Permite cambios de configuración sin deployment • Parámetros pueden tener fecha de comienzo & fin • Todos los parámetros presentes en cache • Con cambio de valor, cache es actualizado y procesos de cola reiniciados
  • 85.
    Symfony @ OpenSky RuntimeSettings/Parameters • Parámetros definidos en config/parameters.yml • Cambios guardados en MongoDB • Permite cambios de configuración sin deployment • Parámetros pueden tener fecha de comienzo & fin • Todos los parámetros presentes en cache • Con cambio de valor, cache es actualizado y procesos de cola reiniciados • Muy usado para activar/desactivar nueva/vieja funcionalidad
  • 86.
    Symfony @ OpenSky RuntimeSettings/Parameters
  • 87.
    Symfony @ OpenSky RuntimeSettings/Parameters
  • 88.
    Symfony @ OpenSky RuntimeSettings/Parameters Dev/Testing: production.flag = false Production: production.flag = true
  • 89.
  • 90.
    Symfony @ OpenSky •Realizar tareas luego de enviar la respuesta al cliente Evento kernel.terminate
  • 91.
    Symfony @ OpenSky •Realizar tareas luego de enviar la respuesta al cliente • Guardar Request Log en MongoDB Evento kernel.terminate
  • 92.
    Symfony @ OpenSky •Realizar tareas luego de enviar la respuesta al cliente • Guardar Request Log en MongoDB • Analizar petición para acciones adicionales Evento kernel.terminate
  • 93.
    Symfony @ OpenSky •Realizar tareas luego de enviar la respuesta al cliente • Guardar Request Log en MongoDB • Analizar petición para acciones adicionales • Sólo efectivo con FastCGI Evento kernel.terminate
  • 94.
    Symfony @ OpenSky •Encolar eventos para funcionalidad asíncrona Sistema de Eventos
  • 95.
    Symfony @ OpenSky •Encolar eventos para funcionalidad asíncrona • Serializador/Deserializador de eventos Sistema de Eventos
  • 96.
    Symfony @ OpenSky •Encolar eventos para funcionalidad asíncrona • Serializador/Deserializador de eventos • Eventos programados a futuro Sistema de Eventos
  • 97.
    Symfony @ OpenSky •Encolar eventos para funcionalidad asíncrona • Serializador/Deserializador de eventos • Eventos programados a futuro • Multiples intentos Sistema de Eventos
  • 98.
    Symfony @ OpenSky •Encolar eventos para funcionalidad asíncrona • Serializador/Deserializador de eventos • Eventos programados a futuro • Multiples intentos • Una cola por collection de mongodb Sistema de Eventos
  • 99.
    Symfony @ OpenSky •Encolar eventos para funcionalidad asíncrona • Serializador/Deserializador de eventos • Eventos programados a futuro • Multiples intentos • Una cola por collection de mongodb • Consumidores de cola manejados con Supervisord Sistema de Eventos
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
    Symfony @ OpenSky •php-kip usando yabot Integración con Slack
  • 107.
    Symfony @ OpenSky •php-kip usando yabot • Manejo de línea de deploy de producción Integración con Slack
  • 108.
    Symfony @ OpenSky •php-kip usando yabot • Manejo de línea de deploy de producción • Reservaciones y deploys de entornos de integración Integración con Slack
  • 109.
    Symfony @ OpenSky •php-kip usando yabot • Manejo de línea de deploy de producción • Reservaciones y deploys de entornos de integración • Notificaciones desde Symfony Integración con Slack
  • 110.
    Symfony @ OpenSky Symfonyat OpenSky Php-kip using yubot - Production deploy queue/line - Dev environment deploys Integración con Slack
  • 111.
    Symfony @ OpenSky Symfonyat OpenSky Php-kip using yubot - Production deploy queue/line - Dev environment deploys Integración con Slack
  • 112.
    Symfony @ OpenSky Symfonyat OpenSky Php-kip using yubot - Production deploy queue/line - Dev environment deploys Integración con Slack
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
    Symfony @ OpenSky Search •Integración con Algolia
  • 118.
    Symfony @ OpenSky Search •Integración con Algolia • algolia/algoliasearch-client-php
  • 119.
    Symfony @ OpenSky Search •Integración con Algolia • algolia/algoliasearch-client-php • Actualización de index con Event Listeners
  • 120.
    Symfony @ OpenSky Pagos •Integración con Braintree Payments • braintree/braintree_php
  • 121.
    Symfony @ OpenSky •NPM • jQuery • RequireJS • Backbone • TwigJS • Gulp / Less / Sass El Frontend
  • 122.
  • 123.
    Symfony @ OpenSky •pr-nightmare Testing
  • 124.
    Symfony @ OpenSky •pr-nightmare • Corre en todos los commits y pull requests Testing
  • 125.
    Symfony @ OpenSky •pr-nightmare • Corre en todos los commits y pull requests • Usa PHPChunkit para ejecutar 30 minutos de tests en 3 minutos corriendo grupos de tests en paralelo distribuidos en varios servidores
 https://github.com/jwage/phpchunkit Testing
  • 126.
  • 127.
    Symfony @ OpenSky •Anotación ‘@app admin’ para indicar que app/ kernel usar en el web test case Testing con PHPUnit
  • 128.
    Symfony @ OpenSky •Anotación ‘@app admin’ para indicar que app/ kernel usar en el web test case • AutoDataCleanupListener automáticamente monitorea las colecciones y tablas donde insertamos datos para luego limpiarlas Testing con PHPUnit
  • 129.
    Symfony @ OpenSky •Anotación ‘@app admin’ para indicar que app/ kernel usar en el web test case • AutoDataCleanupListener automáticamente monitorea las colecciones y tablas donde insertamos datos para luego limpiarlas • AbstractTwigLintTest: Twig linting. Carga y chequea todos los archivos Twig para errores de sintaxis Testing con PHPUnit
  • 130.
    Symfony @ OpenSky •Anotación ‘@app admin’ para indicar que app/ kernel usar en el web test case • AutoDataCleanupListener automáticamente monitorea las colecciones y tablas donde insertamos datos para luego limpiarlas • AbstractTwigLintTest: Twig linting. Carga y chequea todos los archivos Twig para errores de sintaxis • Comando para generar archivos de definición de tests basado en las clases PHP Testing con PHPUnit
  • 131.
    Symfony @ OpenSky •Anotación ‘@app admin’ para indicar que app/ kernel usar en el web test case • AutoDataCleanupListener automáticamente monitorea las colecciones y tablas donde insertamos datos para luego limpiarlas • AbstractTwigLintTest: Twig linting. Carga y chequea todos los archivos Twig para errores de sintaxis • Comando para generar archivos de definición de tests basado en las clases PHP • Comando para PHPUnit watch Testing con PHPUnit
  • 132.
  • 133.
    Symfony @ OpenSky •Correr con PHP 7 Testing con PHPUnit
  • 134.
    Symfony @ OpenSky •Correr con PHP 7 • Deshabilitar XDebug Testing con PHPUnit
  • 135.
    Symfony @ OpenSky •Correr con PHP 7 • Deshabilitar XDebug • Crear Mocks Testing con PHPUnit
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
    Symfony @ OpenSky TwigLint con PHPUnit
  • 141.
    Symfony @ OpenSky TwigLint con PHPUnit
  • 142.
    Symfony @ OpenSky TwigLint con PHPUnit
  • 143.
  • 144.
  • 145.
    Symfony @ OpenSky Deployment •Fabric extendido • Iniciado manualmente desde Jenkins
  • 146.
    Symfony @ OpenSky Deployment •Fabric extendido • Iniciado manualmente desde Jenkins • Primera tarea de build
  • 147.
    Symfony @ OpenSky Deployment •Fabric extendido • Iniciado manualmente desde Jenkins • Primera tarea de build • Merge rama feature/fix a master • Crea Tag
  • 148.
    Symfony @ OpenSky Deployment •Fabric extendido • Iniciado manualmente desde Jenkins • Primera tarea de build • Merge rama feature/fix a master • Crea Tag • Segunda tarea de build
  • 149.
    Symfony @ OpenSky Deployment •Fabric extendido • Iniciado manualmente desde Jenkins • Primera tarea de build • Merge rama feature/fix a master • Crea Tag • Segunda tarea de build • git checkout • composer install --no-dev —no-scripts • Genera front controller • Corre gulp, requires, less, sass • Warmup cache para cada app • Assetic dump • Crea archivo de artifacts & distribuye a los servidores • Corre migraciones de MySQL & MongoDB • Rota logs • Reinicia php-fpm • Recarga Varnish and nginx • Reinicia queue workers
  • 150.
  • 151.
    Symfony @ OpenSky ¿Quésigue? • Actualizar a Symfony 3
  • 152.
    Symfony @ OpenSky •Actualizar a Symfony 3 • Crear aplicaciones adicionales para mejorar rendimiento de areas específicas ¿Qué sigue?
  • 153.
    Symfony @ OpenSky •Actualizar a Symfony 3 • Crear aplicaciones adicionales para mejorar rendimiento de areas específicas • Actualizar el frontend utilizando un stack más moderno ¿Qué sigue?
  • 154.
    Symfony @ OpenSky •Actualizar a Symfony 3 • Crear aplicaciones adicionales para mejorar rendimiento de areas específicas • Actualizar el frontend utilizando un stack más moderno • Retirar Assetic ¿Qué sigue?
  • 155.
    Symfony @ OpenSky •Actualizar a Symfony 3 • Crear aplicaciones adicionales para mejorar rendimiento de areas específicas • Actualizar el frontend utilizando un stack más moderno • Retirar Assetic • Incrementar los tests funcionales ¿Qué sigue?
  • 156.
    Symfony @ OpenSky •Actualizar a Symfony 3 • Crear aplicaciones adicionales para mejorar rendimiento de areas específicas • Actualizar el frontend utilizando un stack más moderno • Retirar Assetic • Incrementar los tests funcionales • Usar RabbitMQ ¿Qué sigue?
  • 157.
    Symfony @ OpenSky •Actualizar a Symfony 3 • Crear aplicaciones adicionales para mejorar rendimiento de areas específicas • Actualizar el frontend utilizando un stack más moderno • Retirar Assetic • Incrementar los tests funcionales • Usar RabbitMQ • Muchas cosas más ¿Qué sigue?
  • 158.
  • 159.
    Symfony @ OpenSky ¡Muchasgracias! @pgodel http://slideshare.net/pgodel