Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony

11,000 views

Published on

Un recorrido por las novedades que traerá Symfony 4 (cuando se publique en noviembre de 2017) y un primer vistazo a Symfony Flex, la nueva herramienta para crear y gestionar aplicaciones Symfony.

Published in: Technology
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • I loved how easy it is to use Symfony flex (https://www.cloudways.com/blog/using-symfony-flex/ ) to create an API for your project. API development is quick with Symfony flex because it knows about the bundles required and automatically installs them. Symfony flex recipes are a nice addition a developer's arsenal.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • English version is not avaliable?
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony

  1. 1. deSymfony 30 junio - 1 julio 2017 Castellón SYMFONY 4, SYMFONY FLEX Y EL FUTURO DE SYMFONY Javier Eguiluz
  2. 2. deSymfony ¡Muchas gracias a nuestros patrocinadores!
  3. 3. Licencia de esta presentación creativecommons.org/licenses/by-nc-sa/3.0
  4. 4. Me presento
  5. 5. JavierEguiluz formadoryevangelizador deSymfony
  6. 6. Agenda
  7. 7. Agenda • ¿QuecambiostraeráSymfony4? • ¿QuéesSymfonyFlex? • ¿CómomepreparoparaSymfony4yFlex?
  8. 8. El presente de Symfony
  9. 9. Hoja de ruta de Symfony Mayo 2017 Symfony 3.3 y Flex Noviembre 2017 Symfony 3.4 y 4.0 Junio 2017 deSymfony
  10. 10. Hoja de ruta de Symfony Mayo 2017 Symfony 3.3 y Flex Noviembre 2017 Symfony 3.4 y 4.0 153 días Junio 2017 deSymfony
  11. 11. Lo bueno
  12. 12. Symfonysiguesiendo relevante10añosdespués desulanzamiento.
  13. 13. El framework más estándar • PSR-2(sintaxisdecódigo) • PSR-3(logs) • PSR-4(cargaautomáticadeclases) • PSR-6(cache) • PSR-7(mensajesHTTP)(*soporteparcial) • PSR-11(contenedoresdeservicios) • PSR-16(cachésimplificada)
  14. 14. Seguimos creciendo DescargasdiariasdelframeworkSymfony
  15. 15. Seguimos creciendo DescargastotalesdeloscomponentesSymfony
  16. 16. Lo malo
  17. 17. Eselmomentomáscrucial delahistoriadeSymfony
  18. 18. Elcambiotecnológicose estáacelerando IoT IA ASR &NLUAR
  19. 19. Cloud API first Isomorphic apps Serverless Sereplantealautilidad delosframeworks
  20. 20. ¿Quétienequehacer Symfonyparaseguirsiendo relevanteenlospróximos5 años?
  21. 21. Integración
  22. 22. Un framework de bajo nivel • Conlosaños,Symfonysehaido convirtiendoenunframeworkdebajonivel. • EstamosmáscercadePHPquedeofrecer funcionalidadescompletas. • Noesalgomalo,siemprequeincluyas tambiénutilidadesdealtonivel.
  23. 23. Ejemplos de integraciones • ElloggerintegralalibreríaMonolog. • ElmailerpermiteusarGmailfácilmente. • Losformulariosincluyentemaspara BootstrapyFoundation.
  24. 24. Nuevos componentes Componente
 Cache APCu Memcache Doctrine Cache Redis
  25. 25. Nuevos componentes Componente
 Lock PHP flock Memcache PHP Semaphore Redis
  26. 26. Nuevos componentes Componente
 WebLink HTML 5 Link HTML 5 Preload Cloudflare HTTP/2
  27. 27. Nuevos componentes Componente
 AMQP RabbitMQ Componente
 Worker
  28. 28. Nuevos componentes Componente
 ???? Gulp Webpack ????? Grunt
  29. 29. Webpack Encore
  30. 30. ¿Qué es Webpack Encore? • Lanuevaherramientaoficialparagestionar assetsweb(CSS,JavaScript,fuentes, imágenes) • ReemplazaaAssetic.
  31. 31. Webpack Encore por dentro • EstáprogramadoconJavaScript,noPHP. • InternamentehaceusodeWebpack. • Encorees"simplemente"unaformasencilla deconfigurarWebpack.
  32. 32. Symfony + Webpack Encore Composer PHP Symfony
  33. 33. Symfony + Webpack Encore yarn / npm Node.js Webpack Webpack Encore Composer PHP Symfony
  34. 34. Webpack Encore en la práctica • Soportatodoloqueseusaenaplicaciones front-endmodernas(preprocessors,PostCSS, React,Babel,VUE,sourcemaps,versioning,CDNs,hot modulereplacements,etc.) • Tambiénsirveparaaplicacionesclásicaso sencillas(e.j.BootstrapyjQuery)
  35. 35. Definiendo los assets con Webpack Encore package.json webpack.config.js assets/ app.scss app.js
  36. 36. Paso 1: crear package.json { "devDependencies": { "@symfony/webpack-encore": "^0.7.1", "bootstrap-sass": "^3.3.7", "jquery": "^3.2.1", "node-sass": "^4.5.3", "sass-loader": "^6.0.5", } }
  37. 37. Añadiendo dependencias de front-end $ yarn add @symfony/webpack-encore --dev $ yarn add bootstrap-sass --dev $ yarn add jquery --dev
  38. 38. Paso 2: crear webpack.config.js var Encore = require('@symfony/webpack-encore'); Encore .setOutputPath('web/build/') .setPublicPath('/build') .autoProvidejQuery() .enableSassLoader() .addEntry('js/app', ['./assets/app.js']) .addStyleEntry('css/app', ['./assets/app.scss']) ; module.exports = Encore.getWebpackConfig();
  39. 39. Paso 3: crear tus propios SCSS y JS @import "~bootstrap-sass"; body { color: $primary-color; // ... } assets/app.scss import 'jquery'; import 'bootstrap-sass'; window.addEventListener('load', function () { // ... }); assets/app.js
  40. 40. Paso 4: generar los assets finales // mientras desarrollas la aplicación en local $ ./node_modules/.bin/encore dev $ ./node_modules/.bin/encore dev --watch // en el servidor de producción $ ./node_modules/.bin/encore production
  41. 41. Assets generados por Webpack Encore web/ build/ css/ app.css js/ app.js
  42. 42. Paso 5: enlazar los assets en las plantillas framework: # ... assets: json_manifest_path: '%kernel.project_dir%/web/build/manifest.json' <html> <head> <link rel="stylesheet" href="{{ asset('build/css/app.css') }}"> <script src="{{ asset('build/js/app.js') }}"></script>
  43. 43. Configuración para los assets de Symfony Demo Webpack Webpack Encore
  44. 44. Más integraciones
  45. 45. Añadiendo más integraciones • Idea:integraciónsimpledetecnologías(e.g. Webpack,Bootstrap) yservicios(AWS,GoogleCloud,Stripe, Mailgun,etc.) • SinreinventarAPIsointroducirnuevosconceptos • Siempreopcional • Todavíaestamospensandoencómohacerlo.
  46. 46. Symfony 4: la filosofía
  47. 47. Enelámbitotecnológicosolo haydosopciones:cambiaro desaparecer.
  48. 48. La filosofía de Symfony SYMFONY
 1.x SYMFONY
 2.x SYMFONY
 3.x SYMFONY
 4.x
  49. 49. La filosofía de Symfony SYMFONY
 1.x SYMFONY
 2.x SYMFONY
 3.x SYMFONY
 4.x Monolito mágico
  50. 50. La filosofía de Symfony SYMFONY
 1.x SYMFONY
 2.x SYMFONY
 3.x SYMFONY
 4.x Monolito mágico Monolito + Componentes desacoplados
  51. 51. La filosofía de Symfony SYMFONY
 1.x SYMFONY
 2.x SYMFONY
 3.x SYMFONY
 4.x Monolito mágico Monolito + Componentes desacoplados Monolito + Micro + Componentes desacoplados
  52. 52. La filosofía de Symfony SYMFONY
 1.x SYMFONY
 2.x SYMFONY
 3.x SYMFONY
 4.x Monolito mágico Monolito + Componentes desacoplados Monolito + Micro + Componentes desacoplados Plataforma + Micro + Componentes desacoplados
  53. 53. Symfony4seráelmayor cambiodelahistoriade Symfony
  54. 54. Symfony 1, 2, 3 Symfony 4 • Aplicacionesweb
 
 
 
 
 
 
 • Aplicacionesweb • Microservicios • APIs • Aplicacionesdeconsola
 

  55. 55. Creando un microservicio $ symfony new mi-micro-servicio Preparing project... ✔ Symfony 3.3.2 was successfully installed. Now you can: * Change your current directory to /proyectos/mi-micro-servicio * Configure your application in app/config/parameters.yml file. * Run your application Downloading Symfony... 5.8 MiB/5.8 MiB ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 100%
  56. 56. La edición estándar de Symfony
  57. 57. Cada tipo de aplicación tiene sus necesidades Microservicios Aplicaciones web API
  58. 58. La edición estándar abarca todo Edición estándar de Symfony
  59. 59. La edición estándar de Symfony Monolog Bundle SwiftMailer Bundle Polyfill Util Polyfill PHP 7.0 Polyfill PHP 5.6 Polyfill Mbstring Polyfill Intl ICU Polyfill APCu PHPUnit Bridge Debug Bundle Framework Bundle Security Bundle Twig Bundle WebProfiler Bundle WebServer BundleDoctrine Bridge Monolog Bridge Twig Bridge Monolog Doctrine (11) SecurityChecker Generator Bundle ParamHandler FrameworkExtra Bundle Distribution Bundle Asset BrowserKit Cache ClassLoader Config Console CssSelector Debug DependencyInjection DomCrawler Dotenv EventDispatcher ExpressionLanguage Filesystem Finder Form HttpFoundation HttpKernel Inflector Intl Ldap OptionsResolver Process PropertyAccess PropertyInfo Routing Security Serializer Stopwatch Templating Translation Validator VarDumper WebLink Workflow Yaml 4 bridges 15 librerías 11 bundles42 components SwiftMailer
  60. 60. Monolog Bundle SwiftMailer Bundle Polyfill Util Polyfill PHP 7.0 Polyfill PHP 5.6 Polyfill Mbstring Polyfill Intl ICU Polyfill APCu PHPUnit Bridge Debug Bundle Framework Bundle Security Bundle Twig Bundle WebProfiler Bundle WebServer BundleDoctrine Bridge Monolog Bridge Twig Bridge Monolog Doctrine (11) SecurityChecker Generator Bundle ParamHandler FrameworkExtra Bundle Distribution Bundle Asset BrowserKit Cache ClassLoader Config Console CssSelector Debug DependencyInjection DomCrawler Dotenv EventDispatcher ExpressionLanguage Filesystem Finder Form HttpFoundation HttpKernel Inflector Intl Ldap OptionsResolver Process PropertyAccess PropertyInfo Routing Security Serializer Stopwatch Templating Translation Validator VarDumper WebLink Workflow Yaml 4 bridges 15 librerías 11 bundles42 components SwiftMailer ¿Usas todo lo que incluye la edición estándar? Form 34,389líneas de código
  61. 61. Código PHP en vendor/ *se incluyen todos los tests 362,5645,274 archivos líneas de código
  62. 62. Symfony 1, 2, 3 Symfony 4 Micro- aplicaciones pordefecto Monolitos siquieres Monolitos pordefecto Micro- aplicaciones siquieres
  63. 63. ANTES: app/AppKernel.php use SymfonyComponentHttpKernelKernel; class AppKernel extends Kernel { public function registerBundles(); public function getCacheDir(); public function getLogDir(); public function registerContainerConfiguration(LoaderInterface $loader); }
  64. 64. AHORA: src/Kernel.php use SymfonyBundleFrameworkBundleKernelMicroKernelTrait; use SymfonyComponentHttpKernelKernel as BaseKernel; final class Kernel extends BaseKernel { use MicroKernelTrait; public function getCacheDir(); public function getLogDir(); public function registerBundles(); protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader); protected function configureRoutes(RouteCollectionBuilder $routes); }
  65. 65. Conceptos que desaparecen en Symfony 4 • SymfonyStandardEdition • SymfonyFull-StackFramework • DistribucionesSymfony • SensioDistributionBundle
  66. 66. Symfony 4: estructura
  67. 67. Se mantiene todo lo que ya conoces • Comandos • Controladores • Plantillas • Entidadesyrepositorios • Eventsubscribers • ExtensionesdeTwig
  68. 68. Directorios
  69. 69. Estructura de directorios por defecto app AppKernel.php config parameters.yml Resources views bin console src AppBundle tests var cache logs web app.php app_dev.php etc bin console src Kernel.php templates tests var cache logs web index.php .env Makefile Symfony 2 Symfony 3 Symfony 4 app AppKernel.php console cache config parameters.yml logs Resources views src AppBundle Tests web app.php app_dev.php
  70. 70. Estructura de directorios de Symfony 4 assets/ etc/ container.yaml routing.yaml packages/ bin/ console src/ Kernel.php templates/ tests/ var/ cache/ logs/ web/ index.php .env
  71. 71. Ventajas de la nueva estructura • Más"plana"yfácildenavegar. • Centralizacontenidosmanejadospor personasajenasalbackend(assets/,templates/) • DesacopladodeSymfony(assets/,src/, templates/,web/)
  72. 72. Bundles
  73. 73. Symfony 2 src/ CartBundle/ Controller/ DefaultController.php ProductBundle/ Controller/ DefaultController.php UserBundle/ Controller/ DefaultController.php
  74. 74. Symfony 2 src/ CartBundle/ Controller/ DefaultController.php ProductBundle/ Controller/ DefaultController.php UserBundle/ Controller/ DefaultController.php Symfony 3 src/ AppBundle/ Controller/ CartController.php ProductController.php UserController.php
  75. 75. Symfony 2 src/ CartBundle/ Controller/ DefaultController.php ProductBundle/ Controller/ DefaultController.php UserBundle/ Controller/ DefaultController.php Symfony 3 src/ AppBundle/ Controller/ CartController.php ProductController.php UserController.php src/ Controller/ CartController.php ProductController.php UserController.php Symfony 4
  76. 76. Elcódigodelasaplicaciones yanosedivideenbundles.
  77. 77. El código se define bajo el namespace App // src/Controller/UserController.php namespace App; use SymfonyBundleFrameworkBundleControllerController; class UserController extends Controller { // ... }
  78. 78. Los dos namespaces definidos por defecto { "...": "...", "autoload": { "psr-4": { "App": "src/" } }, "autoload-dev": { "psr-4": { "AppTests": "tests/" } } } composer.json
  79. 79. Alternativas para seguir usando bundles • Convertirlosbundlesdetuaplicaciónen"third- partybundles"einstalarlosmedianteComposer • UsarlosnamespacesdePHPparasimularla separaciónmodulardecódigo. • Nohacernadayasumirquelosbundleshan desaparecido.
  80. 80. Controlador frontal es es
  81. 81. Symfony 3 web/ app.php app_dev.php apple-touch-icon.png config.php favicon.ico robots.txt Symfony 4 web/ index.php
  82. 82. Solo 1 controlador frontal (web/index.php) use AppKernel; use SymfonyComponentHttpFoundationRequest; require __DIR__.'/../vendor/autoload.php'; // ... $kernel = new Kernel(getenv('APP_ENV'), getenv('APP_DEBUG')); $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response);
  83. 83. Solo 1 controlador frontal (web/index.php) use AppKernel; use SymfonyComponentHttpFoundationRequest; require __DIR__.'/../vendor/autoload.php'; // ... $kernel = new Kernel(getenv('APP_ENV'), getenv('APP_DEBUG')); $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response);
  84. 84. Symfony 4: configuración
  85. 85. Servicios y rutas
  86. 86. Principales archivos de configuración app/ config/ config.yml routing.yml services.yml Symfony 3 Symfony 4 etc/ container.yaml routing.yaml packages/ *.yaml
  87. 87. Principales archivos de configuración app/ config/ config.yml routing.yml services.yml Symfony 3 Symfony 4 etc/ container.yaml routing.yaml packages/ *.yaml
  88. 88. Principales archivos de configuración app/ config/ config.yml routing.yml services.yml Symfony 3 Symfony 4 etc/ container.yaml routing.yaml packages/ *.yaml
  89. 89. Bundles
  90. 90. Activar y desactivar bundles app/ AppKernel.php Symfony 3 Symfony 4 etc/ bundles.php
  91. 91. Los bundles se activan en etc/bundles.php <?php return [ 'SymfonyBundleFrameworkBundleFrameworkBundle' => ['all' => true], 'SymfonyBundleMonologBundleMonologBundle' => ['all' => true], 'DoctrineBundleDoctrineCacheBundleDoctrineCacheBundle' => ['all' => true], 'DoctrineBundleDoctrineBundleDoctrineBundle' => ['all' => true], 'SymfonyBundleWebProfilerBundleWebProfilerBundle' => ['dev' => true, 'test' => true], 'SymfonyBundleTwigBundleTwigBundle' => ['all' => true], ];
  92. 92. Los bundles se activan en etc/bundles.php <?php return [ 'SymfonyBundleFrameworkBundleFrameworkBundle' => ['all' => true], 'SymfonyBundleMonologBundleMonologBundle' => ['all' => true], 'DoctrineBundleDoctrineCacheBundleDoctrineCacheBundle' => ['all' => true], 'DoctrineBundleDoctrineBundleDoctrineBundle' => ['all' => true], 'SymfonyBundleWebProfilerBundleWebProfilerBundle' => ['dev' => true, 'test' => true], 'SymfonyBundleTwigBundleTwigBundle' => ['all' => true], ]; TRUCO Si usas Symfony Flex, los bundles se activan y desactivan automáticamente.
  93. 93. Configuración por paquete/bundle app/ config/ config.yml Symfony 3 Symfony 4 etc/ packages/ doctrine.yaml framework.yaml security.yaml twig.yaml web_profiler.yaml
  94. 94. Reconfigurando la aplicación # ... twig: debug: '%kernel.debug%' strict_variables: '%kernel.debug%' doctrine: dbal: driver: pdo_mysql host: '%database_host%' port: '%database_port%' dbname: '%database_name%' user: '%database_user%' password: '%database_password%' charset: UTF8 # ... swiftmailer: transport: '%mailer_transport%' host: '%mailer_host%' username: '%mailer_user%' password: '%mailer_password%' spool: { type: memory } twig: debug: '%kernel.debug%' strict_variables: '%kernel.debug%' etc/packages/twig.yaml doctrine: dbal: driver: pdo_mysql host: '%database_host%' port: '%database_port%' dbname: '%database_name%' user: '%database_user%' password: '%database_password%' charset: UTF8 # ... etc/packages/doctrine.yaml swiftmailer: transport: '%mailer_transport%' host: '%mailer_host%' username: '%mailer_user%' password: '%mailer_password%' spool: { type: memory } etc/packages/swiftmailer.yaml app/config/config.yml
  95. 95. Cómo carga Symfony 4 la configuración namespace App; use SymfonyBundleFrameworkBundleKernelMicroKernelTrait; use SymfonyComponentConfigLoaderLoaderInterface; use SymfonyComponentDependencyInjectionContainerBuilder; use SymfonyComponentHttpKernelKernel as BaseKernel; final class Kernel extends BaseKernel { use MicroKernelTrait; // ... protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void { $confDir = dirname(__DIR__).'/etc'; $loader->load($confDir.'/packages/*.{php,xml,yaml}', 'glob'); if (is_dir($confDir.'/packages/'.$this->environment)) { $loader->load($confDir.'/packages/'.$this->environment.'/**/*.{php,xml,yaml}, 'glob'); } $loader->load($confDir.'/container.{php,xml,yaml}', 'glob'); } }
  96. 96. Configuración por entorno app/ config/ config.yml config_dev.yml config_prod.yml config_test.yml Symfony 3 Symfony 4 etc/ packages/ *.yaml dev/ *.yaml prod/ *.yaml test/ *.yaml
  97. 97. Variables de entorno
  98. 98. Configuración de parámetros tu-proyecto/ app/ config/ parameters.yml parameters.yml.dist Symfony 3 Symfony 4 tu-proyecto/ .env .env.dist
  99. 99. Definiendo parámetros de configuración parameters: database_host: 127.0.0.1 database_port: null database_name: symfony database_user: root database_password: null mailer_transport: smtp mailer_host: 127.0.0.1 mailer_user: null mailer_password: null secret: f10a04dccf17d310bb91cf611d107343cb396 Symfony 3 Symfony 4 APP_SECRET = f10a04dccf17d310bb91cf611d107343cb396 DATABASE_URL = "mysql://root@127.0.0.1:3306/symfony" MAILER_URL = "smtp://localhost:25?encryption=&auth_mode="
  100. 100. Definiendo parámetros de configuración parameters: database_host: 127.0.0.1 database_port: null database_name: symfony database_user: root database_password: null mailer_transport: smtp mailer_host: 127.0.0.1 mailer_user: null mailer_password: null secret: f10a04dccf17d310bb91cf611d107343cb396 Symfony 3 Symfony 4 APP_SECRET = f10a04dccf17d310bb91cf611d107343cb396 DATABASE_URL = "mysql://root@127.0.0.1:3306/symfony" MAILER_URL = "smtp://localhost:25?encryption=&auth_mode=" CUIDADO Todas las variables de entorno son de tipo string.
  101. 101. Configuración con sintaxis DSN parameters: database_host: 127.0.0.1 database_port: null database_name: symfony database_user: root database_password: null Symfony 3 Symfony 4 DATABASE_URL = "mysql://root@127.0.0.1:3306/symfony"
  102. 102. Configurando el entorno y el debug // web/app_dev.php $kernel = new AppKernel('dev', true); $request = Request::createFromGlobals(); // ... // web/app.php $kernel = new AppKernel('prod', false); $request = Request::createFromGlobals(); // ... Symfony 3 Symfony 4 # .env APP_ENV = dev APP_DEBUG = 1
  103. 103. Ejecutando comandos # Symfony 3 $ ./bin/console foo:bar --env=prod —no-debug $ SYMFONY_ENV=prod SYMFONY_DEBUG=0 ./bin/console foo:bar # Symfony 4 $ ./bin/console foo:bar
  104. 104. Ejecutando comandos # Symfony 3 $ ./bin/console foo:bar --env=prod —no-debug $ SYMFONY_ENV=prod SYMFONY_DEBUG=0 ./bin/console foo:bar # Symfony 4 $ ./bin/console foo:bar TRUCO La consola accede al archivo .env para obtener el valor de APP_DEBUG y APP_ENV
  105. 105. Symfony4seráasípor defecto,peroyapuedesusar todoestoenSymfony3.3 graciasaSymfonyFlex.
  106. 106. Symfony Flex
  107. 107. SymfonyFlexeslanueva formadecrearygestionar aplicacionesSymfony.
  108. 108. Symfony Flex • NoesunaversiónespecialdeSymfony. • ReemplazaalinstaladordeSymfony. • Noseráestablehastaellanzamientode Symfony4,peroyasepuedeusar. • SuusoesOPCIONAL(inclusoenSymfony4)
  109. 109. Compatibilidad de Symfony Flex SYMFONY
 3.2 SYMFONY
 3.3 SYMFONY
 3.4 SYMFONY
 4.0 SYMFONY
 4.1 NO funciona SI funciona Se usa por defecto (pero sigue siendo opcional)
  110. 110. Instalando un paquete con Composer $ composer require symfony/console
  111. 111. Instalando un paquete con Composer $ composer require symfony/console github.compackagist.org
  112. 112. Instalando un paquete con Composer $ composer require symfony/console github.compackagist.org
  113. 113. Instalando un paquete con Composer $ composer require symfony/console github.compackagist.org
  114. 114. Instalando un paquete con Composer $ composer require symfony/console github.compackagist.org
  115. 115. Instalando Flex en un proyecto existente $ composer require symfony/flex
  116. 116. Instalando un paquete con Composer + Flex $ composer require symfony/console
  117. 117. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh
  118. 118. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh
  119. 119. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh receta
  120. 120. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh receta
  121. 121. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh receta
  122. 122. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh receta
  123. 123. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh receta
  124. 124. Symfony Flex en acción $ composer require doctrine Using version ^1.0 for symfony/orm-pack Package operations: 14 installs, 0 updates, 0 removals - Installing doctrine/annotations (v1.4.0): Loading from cache - ... Symfony operations: 3 recipes - Configuring doctrine/doctrine-cache-bundle (1.3.0): From auto-generated recipe - Configuring symfony/console (3.3): From github.com/symfony/recipes:master - Configuring doctrine/doctrine-bundle (1.6): From github.com/symfony/recipes:master
  125. 125. Symfony Flex en acción $ composer require doctrine Using version ^1.0 for symfony/orm-pack Package operations: 14 installs, 0 updates, 0 removals - Installing doctrine/annotations (v1.4.0): Loading from cache - ... Symfony operations: 3 recipes - Configuring doctrine/doctrine-cache-bundle (1.3.0): From auto-generated recipe - Configuring symfony/console (3.3): From github.com/symfony/recipes:master - Configuring doctrine/doctrine-bundle (1.6): From github.com/symfony/recipes:master Symfony Flex
  126. 126. Symfony Flex en la práctica
  127. 127. Ejemplo #1 Crear un nuevo proyecto Symfony
  128. 128. Crear un proyecto Symfony SIN Flex $ symfony new mi-proyecto/ ȭ 10 segundos ✔ Symfony 3.3.2 was successfully installed. Now you can: * Change your current directory to /proyectos/mi-micro-servicio * Configure your application in app/config/parameters.yml file. * Run your application
  129. 129. Crear un proyecto Symfony CON Flex $ composer create symfony/skeleton mi-proyecto ȭ 1 minuto What's next? * Run your application: 1. Change to the project directory 2. Execute the make serve command; 3. Browse to the http://localhost:8000/ URL. * Read the documentation at https://symfony.com/doc
  130. 130. Código PHP en vendor/ *se incluyen todos los tests 106,3551,546 archivos líneas de código
  131. 131. Symfony 3.2 vs Symfony 3.3 + Flex 106,3551,546 archivos líneas de código 362,5645,274 -70% -70%
  132. 132. La edición estándar de Symfony Monolog Bundle SwiftMailer Bundle Polyfill Util Polyfill PHP 7.0 Polyfill PHP 5.6 Polyfill Mbstring Polyfill Intl ICU Polyfill APCu PHPUnit Bridge Debug Bundle Framework Bundle Security Bundle Twig Bundle WebProfiler Bundle WebServer BundleDoctrine Bridge Monolog Bridge Twig Bridge Monolog Doctrine (11) SecurityChecker Generator Bundle ParamHandler FrameworkExtra Bundle Distribution Bundle Asset BrowserKit Cache ClassLoader Config Console CssSelector Debug DependencyInjection DomCrawler Dotenv EventDispatcher ExpressionLanguage Filesystem Finder Form HttpFoundation HttpKernel Inflector Intl Ldap OptionsResolver Process PropertyAccess PropertyInfo Routing Security Serializer Stopwatch Templating Translation Validator VarDumper WebLink Workflow Yaml 4 bridges 15 librerías 11 bundles42 components SwiftMailer
  133. 133. Symfony Flex Polyfill Mbstring Framework Bundle Doctrine (1) Cache ClassLoader Config Debug DependencyInjection Dotenv EventDispatcher Filesystem Finder HttpFoundation HttpKernel Routing Stopwatch Yaml 0 bridges 2 librerías 1 bundle15 components Flex
  134. 134. Las dependencias de Symfony Skeleton { "name": "symfony/skeleton", "require": { "php": "^7.1.3", "symfony/flex": "^1.0", "symfony/framework-bundle": "^3.3", "symfony/yaml": "^3.3" }, "require-dev": { "symfony/dotenv": "^3.3" }, }
  135. 135. SIN Symfony Flex CON Symfony Flex
  136. 136. SIN Symfony Flex CON Symfony Flex
  137. 137. Ejemplo #2 Instalar un bundle de terceros
  138. 138. Instalando SncRedisBundle
  139. 139. Instalar SncRedisBundle SIN Flex (1/4) $ composer require snc/redis-bundle
  140. 140. Instalar SncRedisBundle SIN Flex (2/4) // app/AppKernel.php use SymfonyComponentHttpKernelKernel; class AppKernel extends Kernel { public function registerBundles() { $bundles = [ // ... new SncRedisBundleSncRedisBundle(), ]; // ... return $bundles; } // ... }
  141. 141. Instalar SncRedisBundle SIN Flex (3/4) # app/config/parameters.yml parameters: REDIS_URL: "redis://localhost"
  142. 142. Instalar SncRedisBundle SIN Flex (4/4) # app/config/config.yml snc_redis: clients: default: type: predis alias: default dsn: "%env(REDIS_URL)%"
  143. 143. Instalar SncRedisBundle CON Flex $ composer require snc/redis-bundle
  144. 144. Instalar SncRedisBundle CON Flex $ composer require snc/redis-bundle ¡YAESTÁ!
  145. 145. Symfony Flex automatiza el proceso • Flexactivaelbundleenetc/bundles.php • Flexdefinelavariabledeentorno REDIS_URLenweb/.env(yweb/env.dist). • Flexcreaelarchivoetc/packages/ snc_redis.yamlconlaconfiguracióninicial
  146. 146. Symfony Flex automatiza el proceso • Cuandodesinstalaselbundle,Symfony Flexdeshacetodosloscambiosanteriores.
  147. 147. SymfonyFlex = Automatización
  148. 148. Recetas
  149. 149. Recetas de Symfony Flex • SonlasinstruccionesqueutilizaFlexpara automatizarlastareas. • Estánformadasporunarchivo manifest.jsony,opcionalmente,otros archivosydirectorios.
  150. 150. Ejemplo de receta de SncRedisBundle (1/2) { "bundles": { "SncRedisBundleSncRedisBundle": ["all"] }, "copy-from-recipe": { "etc/": "%ETC_DIR%/" }, "env": { "#": "passwords that contain special characters (@, %, :, +) must be urlencoded", "REDIS_URL": "redis://localhost" } }
  151. 151. Ejemplo de receta de SncRedisBundle (2/2) # redis-bundle/2.0/etc/packages/snc_redis.yaml snc_redis: clients: default: type: predis alias: default dsn: "%env(REDIS_URL)%"
  152. 152. Repositorios de recetas • github.com/symfony/recipes
 Elrepositoriooficial.PordefectoSymfonyFlexsolobuscaen esterepositorio. • github.com/symfony/recipes-contrib
 Elrepositoriodelacomunidad.ParausarloconFlex,ejecuta: composerconfigextra.symfony.allow-contribtrue • Porelmomentonosepuedencrearrecetasparapaquetes privadosdetupropiaempresa(sepodráenelfuturo).
  153. 153. Otras ventajas de usar Flex
  154. 154. No hace falta el nombre completo $ composer require logger
  155. 155. No hace falta el nombre completo $ composer require logger ¿Es un "alias"?1 MonologBundle log logger logging logs monolog =
  156. 156. Se han definido decenas de alias $ composer require debug $ composer require doctrine $ composer require logger $ composer require profiler $ composer require server $ composer require twig
  157. 157. No hace falta el nombre completo $ composer require logger ¿Es un "alias"?1 ¿Existe el paquete symfony/xxxx?2
  158. 158. No hace falta el nombre completo $ composer require logger ¿Es un "alias"?1 ¿Existe el paquete symfony/xxxx?2 ¿Existe el paquete xxxx?3
  159. 159. Funcionan más versiones que en Composer $ composer require console:next $ composer require console:previous $ composer require console:latest $ composer require console:stable $ composer require console:lts
  160. 160. Actualizando a Symfony Flex
  161. 161. SymfonyFlexsolofunciona situaplicacióntieneuna determinadaestructurade directorios.
  162. 162. Estructura requerida por Symfony Flex etc/ bundles.php container.yaml routing.yaml packages/ src/ Kernel.php .../ .env
  163. 163. El proceso de actualización • Porelmomento,manual. • Podríapublicarseunaherramienta automática.
  164. 164. Actualiza tu infraestructura PHP7.1 requerido por Symfony Flex y Symfony 4
  165. 165. Paso 1: Crear una aplicación Flex nueva $ composer create symfony/skeleton mi-proyecto-flex
  166. 166. Paso 2: Añade tus dependencias "require": { "doctrine/doctrine-cache-bundle": "^1.2", "dropbox/dropbox-sdk": "^1.1", "easycorp/easy-log-handler": "^1.0", "erusev/parsedown": "~1.5", "guzzlehttp/guzzle": "^6.0", "knplabs/github-api": "~1.2", "...": "...", "white-october/pagerfanta-bundle": "~1.0" }, "require-dev": { "...": "...", }, composer.json del nuevo proyectocomposer.json de tu proyecto "require": { "php": "^7.1.3", "symfony/flex": "^1.0", "symfony/framework-bundle": "^3.3", "symfony/yaml": "^3.3" }, "require-dev": { "symfony/dotenv": "^3.3" },
  167. 167. Paso 3: instala las dependencias $ cd tu-proyecto/ $ composer install
  168. 168. Paso 3: instala las dependencias $ cd tu-proyecto/ $ composer install TRUCO Esto hará que Symfony Flex genere todos los archivos de configuración en etc/packages/*.yaml
  169. 169. Paso 4: Retoca la configuración si hace falta Compruebaloscontenidosdeconfig.yml, config_dev.ymlyconfig_prod.ymlycopiala configuraciónquehagafaltaenlosnuevos archivosetc/packages/*.yaml
  170. 170. Paso 4: Retoca la configuración si hace falta Compruebaloscontenidosdeconfig.yml, config_dev.ymlyconfig_prod.ymlycopiala configuraciónquehagafaltaenlosnuevos archivosetc/packages/*.yaml CUIDADO Esta es la parte más aburrida y donde más fácilmente se pueden cometer errores.
  171. 171. Paso 5: Mueve tu código a src/ • Mejorcaso:todotucódigoestáenAppBundle
 Copiaelcódigodirectamenteensrc/ycambiael namespacedeAppBundleaAppconPHPStorm • Peorcaso:tienesmuchosbundles
 Puedesmantenerlos(cambiandoelnamespaceaApp) perodeberíasirplanteándoteeliminarlos
  172. 172. Paso 6: Mueve tus plantillas • Mejorcaso:plantillasenapp/Resources/views/
 Cópialasdirectamenteentemplates/ • Peorcaso:plantillasenotrosdirectorios
 PuedesmantenerlosactualizandolaconfiguracióndeTwig # etc/packages/twig.yaml twig: paths: ['%kernel.project_dir%/templates'] # ...
  173. 173. Silex
  174. 174. Silex estámuerto
  175. 175. ¿Por qué usas Silex en vez de Symfony? • Másrendimiento • Menoscódigo • Menosdependencias • Menosconfiguración
  176. 176. Silex vs "Viejo Symfony" Silex Viejo Symfony Más Rendimiento Menos Dependencias Menos Líneas de código Menos Configuración Más Funcionalidades RAD Mejor Ecosistema
  177. 177. Silex vs "Nuevo Symfony" (Flex) Silex Nuevo Symfony Más Rendimiento Menos Dependencias Menos Líneas de código Menos Configuración Más Funcionalidades RAD Mejor Ecosistema
  178. 178. Mi consejo • NouséisSilexparanuevosproyectos. • ConsideradvuestrosproyectosSilex existentescomo"legacy". • Preparadunplandeactualizacióna SymfonyFlex.
  179. 179. En resumen
  180. 180. Symfony4 Mantienetodoloquete gusta,peroeliminaloquea lamayoríanolegusta (bundles,configuración,etc.)
  181. 181. Symfony4 Pordefectocreamicro- aplicacionesconun70% menosdecódigoque Symfony3.
  182. 182. Symfony4 Seintegrarámás fácilmenteconserviciosy tecnologíaspopulares.
  183. 183. SymfonyFlex Automatizalastareasmás habitualesdelas aplicacionesSymfony.
  184. 184. Eslamejormanerade probaryamismoloquenos traeráSymfony4en Noviembre. SymfonyFlex
  185. 185. Contacto
  186. 186. Contacto • javier.eguiluz@sensiolabs.com • github.com/javiereguiluz • linkedin.com/in/javiereguiluz

×