Está en la página 1de 188

SYMFONY 4,

SYMFONY FLEX
Y EL FUTURO DE SYMFONY
Javier Eguiluz

deSymfony 30 junio - 1 julio 2017


Castellón
¡Muchas gracias a nuestros
patrocinadores!

deSymfony
Licencia de esta presentación

creativecommons.org/licenses/by-nc-sa/3.0
Me presento
Javier Eguiluz
formador y evangelizador
de Symfony
Agenda
Agenda
• ¿Que cambios traerá Symfony 4?

• ¿Qué es Symfony Flex?

• ¿Cómo me preparo para Symfony 4 y Flex?


El presente de
Symfony
Hoja de ruta de Symfony
Symfony deSymfony Symfony
3.3 y Flex 3.4 y 4.0

Mayo Junio Noviembre


2017 2017 2017
Hoja de ruta de Symfony
Symfony deSymfony 153 días Symfony
3.3 y Flex 3.4 y 4.0

Mayo Junio Noviembre


2017 2017 2017
Lo bueno
Symfony sigue siendo
relevante 10 años después
de su lanzamiento.
El framework más estándar
• PSR-2 (sintaxis de código)

• PSR-3 (logs)

• PSR-4 (carga automática de clases)

• PSR-6 (cache)

• PSR-7 (mensajes HTTP) (*soporte parcial)

• PSR-11 (contenedores de servicios)

• PSR-16 (caché simplificada)


Seguimos creciendo

Descargas diarias del framework Symfony


Seguimos creciendo

Descargas totales de los componentes Symfony


Lo malo
Es el momento más crucial
de la historia de Symfony
El cambio tecnológico se
está acelerando

IoT ASR
AR IA & NLU
Se replantea la utilidad
de los frameworks
Isomorphic Cloud
apps
API
first Serverless
¿Qué tiene que hacer
Symfony para seguir siendo
relevante en los próximos 5
años?
Integración
Un framework de bajo nivel
• Con los años, Symfony se ha ido
convirtiendo en un framework de bajo nivel.
• Estamos más cerca de PHP que de ofrecer
funcionalidades completas.
• No es algo malo, siempre que incluyas
también utilidades de alto nivel.
Ejemplos de integraciones
• El logger integra la librería Monolog.

• El mailer permite usar Gmail fácilmente.

• Los formularios incluyen temas para


Bootstrap y Foundation.
Nuevos componentes
APCu

Componente

Memcache
Cache
Redis

Doctrine Cache
Nuevos componentes
PHP flock

Componente

Memcache
Lock
Redis

PHP Semaphore
Nuevos componentes
HTML 5 Link
HTML 5 Preload
Componente


WebLink
HTTP/2

Cloudflare
Nuevos componentes

Componente


AMQP RabbitMQ

Componente


Worker
Nuevos componentes
Gulp

Componente

Webpack
????
Grunt

?????
Webpack
Encore
¿Qué es Webpack Encore?
• La nueva herramienta oficial para gestionar
assets web (CSS, JavaScript, fuentes,
imágenes)
• Reemplaza a Assetic.
Webpack Encore por dentro
• Está programado con JavaScript, no PHP.

• Internamente hace uso de Webpack.

• Encore es "simplemente" una forma sencilla


de configurar Webpack.
Symfony + Webpack Encore

Symfony

PHP

Composer
Symfony + Webpack Encore
Webpack Encore
Symfony
Webpack

PHP Node.js

Composer yarn / npm


Webpack Encore en la práctica
• Soporta todo lo que se usa en aplicaciones
front-end modernas (preprocessors, PostCSS,
React, Babel, VUE, source maps, versioning, CDNs, hot
module replacements, etc.)

• También sirve para aplicaciones clásicas o


sencillas (e.j. Bootstrap y jQuery)
Definiendo los assets con Webpack Encore
! package.json
! webpack.config.js
" assets/
! app.scss
! app.js
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",
}
}
Añadiendo dependencias de front-end
$ yarn add @symfony/webpack-encore --dev
$ yarn add bootstrap-sass --dev
$ yarn add jquery --dev
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();
Paso 3: crear tus propios SCSS y JS
assets/app.scss assets/app.js
@import "~bootstrap-sass"; import 'jquery';
import 'bootstrap-sass';
body {
color: $primary-color; window.addEventListener('load', function () {
// ... // ...
} });
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
Assets generados por Webpack Encore
" web/
" build/
" css/
! app.css
" js/
! app.js
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>
Configuración para los assets de Symfony Demo
Webpack Webpack
Encore
Más
integraciones
Añadiendo más integraciones
• Idea: integración simple de tecnologías (e.g.
Webpack, Bootstrap) y servicios (AWS, Google Cloud, Stripe,
Mailgun, etc.)

• Sin reinventar APIs o introducir nuevos conceptos

• Siempre opcional

• Todavía estamos pensando en cómo hacerlo.


Symfony 4:
la filosofía
En el ámbito tecnológico solo
hay dos opciones: cambiar o
desaparecer.
La filosofía de Symfony

SYMFONY
 SYMFONY
 SYMFONY
 SYMFONY


1.x 2.x 3.x 4.x


La filosofía de Symfony

SYMFONY
 SYMFONY
 SYMFONY
 SYMFONY


1.x 2.x 3.x 4.x


Monolito
mágico
La filosofía de Symfony

SYMFONY
 SYMFONY
 SYMFONY
 SYMFONY


1.x 2.x 3.x 4.x


Monolito Monolito
mágico +
Componentes
desacoplados
La filosofía de Symfony

SYMFONY
 SYMFONY
 SYMFONY
 SYMFONY


1.x 2.x 3.x 4.x


Monolito Monolito Monolito
mágico + +
Componentes Micro
desacoplados +
Componentes
desacoplados
La filosofía de Symfony

SYMFONY
 SYMFONY
 SYMFONY
 SYMFONY


1.x 2.x 3.x 4.x


Monolito Monolito Monolito Plataforma
mágico + + +
Componentes Micro Micro
desacoplados + +
Componentes Componentes
desacoplados desacoplados
Symfony 4 será el mayor
cambio de la historia de
Symfony
Symfony 1, 2, 3 Symfony 4
• Aplicaciones web
 • Aplicaciones web

 • Microservicios


 • APIs

 • Aplicaciones de consola




Creando un microservicio

$ symfony new mi-micro-servicio


Downloading Symfony...

5.8 MiB/5.8 MiB ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 100%

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


La edición estándar de Symfony
Cada tipo de aplicación tiene sus necesidades

Aplicaciones
web
Microservicios

API
La edición estándar abarca todo

Edición estándar de Symfony


La edición estándar de Symfony
42 components Ldap Routing 4 bridges 11 bundles
Asset Dotenv OptionsResolver Security Doctrine Bridge Debug Bundle WebServer Bundle

BrowserKit EventDispatcher Polyfill APCu Serializer Monolog Bridge Distribution Bundle

Cache ExpressionLanguage Polyfill Intl ICU Stopwatch PHPUnit Bridge Framework Bundle

ClassLoader Filesystem Polyfill Mbstring Templating Twig Bridge FrameworkExtra Bundle

Config Finder Polyfill PHP 5.6 Translation 15 librerías Generator Bundle

Console Form Polyfill PHP 7.0 Validator Doctrine (11) Monolog Bundle

CssSelector HttpFoundation Polyfill Util VarDumper Monolog Security Bundle

Debug HttpKernel Process WebLink SecurityChecker SwiftMailer Bundle

DependencyInjection Inflector PropertyAccess Workflow ParamHandler Twig Bundle

DomCrawler Intl PropertyInfo Yaml SwiftMailer WebProfiler Bundle


¿Usas todo lo que incluye la edición estándar?
42 components Ldap Routing 4 bridges 11 bundles
Asset Dotenv OptionsResolver Security Doctrine Bridge Debug Bundle WebServer Bundle

BrowserKit EventDispatcher Polyfill APCu Serializer Monolog Bridge Distribution Bundle

Cache ExpressionLanguage Polyfill Intl ICU Stopwatch PHPUnit Bridge Framework Bundle

34,389
ClassLoader Filesystem Polyfill Mbstring Templating Twig Bridge FrameworkExtra Bundle

Config Finder Polyfill PHP 5.6 Translation 15 librerías Generator Bundle

Console Form Form Polyfill PHP 7.0 Validator Doctrine (11) Monolog Bundle

CssSelector HttpFoundation Polyfill Util


líneas de código
VarDumper Monolog Security Bundle

Debug HttpKernel Process WebLink SecurityChecker SwiftMailer Bundle

DependencyInjection Inflector PropertyAccess Workflow ParamHandler Twig Bundle

DomCrawler Intl PropertyInfo Yaml SwiftMailer WebProfiler Bundle


Código PHP en vendor/

5,274 362,564
archivos líneas de código

*se incluyen todos los tests


Symfony 1, 2, 3 Symfony 4

Monolitos Micro-
por defecto aplicaciones
por defecto
Micro-
aplicaciones Monolitos
si quieres si quieres
ANTES: app/AppKernel.php
use Symfony\Component\HttpKernel\Kernel;

class AppKernel extends Kernel


{
public function registerBundles();

public function getCacheDir();

public function getLogDir();

public function registerContainerConfiguration(LoaderInterface $loader);


}
AHORA: src/Kernel.php
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\HttpKernel\Kernel 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);


}
Conceptos que desaparecen en Symfony 4
• Symfony Standard Edition

• Symfony Full-Stack Framework

• Distribuciones Symfony

• SensioDistributionBundle
Symfony 4:
estructura
Se mantiene todo lo que ya conoces
• Comandos

• Controladores

• Plantillas

• Entidades y repositorios

• Event subscribers

• Extensiones de Twig
Directorios
Estructura de directorios por defecto
Symfony 2 Symfony 3 Symfony 4
" app " app " etc
! AppKernel.php ! AppKernel.php " bin
! console " config ! console
" cache ! parameters.yml " src
" config " Resources ! Kernel.php
! parameters.yml " views " templates
" logs " bin " tests
" Resources ! console " var
" views " src " cache
" src " AppBundle " logs
" AppBundle " tests " web
" Tests " var ! index.php
" web " cache ! .env
! app.php " logs ! Makefile
! app_dev.php " web
! app.php
! app_dev.php
Estructura de directorios de Symfony 4
" assets/ " templates/
" etc/ " tests/
! container.yaml " var/
! routing.yaml " cache/
" packages/ " logs/
" bin/ " web/
! console ! index.php
" src/ ! .env
! Kernel.php
Ventajas de la nueva estructura
• Más "plana" y fácil de navegar.

• Centraliza contenidos manejados por


personas ajenas al backend (assets/, templates/)
• Desacoplado de Symfony (assets/, src/,
templates/, web/)
Bundles
Symfony 2
" src/
" CartBundle/
" Controller/
! DefaultController.php
" ProductBundle/
" Controller/
! DefaultController.php
" UserBundle/
" Controller/
! DefaultController.php
Symfony 2 Symfony 3
" src/ " src/
" CartBundle/ " AppBundle/
" Controller/ " Controller/
! DefaultController.php ! CartController.php
" ProductBundle/ ! ProductController.php
" Controller/ ! UserController.php
! DefaultController.php
" UserBundle/
" Controller/
! DefaultController.php
Symfony 2 Symfony 3
" src/ " src/
" CartBundle/ " AppBundle/
" Controller/ " Controller/
! DefaultController.php ! CartController.php
" ProductBundle/ ! ProductController.php
" Controller/ ! UserController.php
! DefaultController.php
" UserBundle/ Symfony 4
" Controller/ " src/
! DefaultController.php " Controller/
! CartController.php
! ProductController.php
! UserController.php
El código de las aplicaciones
ya no se divide en bundles.
El código se define bajo el namespace App\
// src/Controller/UserController.php
namespace App;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class UserController extends Controller


{
// ...
}
Los dos namespaces definidos por defecto
composer.json
{
"...": "...",

"autoload": {
"psr-4": { "App\\": "src/" }
},
"autoload-dev": {
"psr-4": { "App\\Tests\\": "tests/" }
}
}
Alternativas para seguir usando bundles
• Convertir los bundles de tu aplicación en "third-
party bundles" e instalarlos mediante Composer
• Usar los namespaces de PHP para simular la
separación modular de código.
• No hacer nada y asumir que los bundles han
desaparecido.
Controladores
frontales
Symfony 3 Symfony 4
" web/ " web/
! app.php ! index.php
! app_dev.php
! apple-touch-icon.png
! config.php
! favicon.ico
! robots.txt
Solo 1 controlador frontal (web/index.php)
use App\Kernel;
use Symfony\Component\HttpFoundation\Request;

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);
Solo 1 controlador frontal (web/index.php)
use App\Kernel;
use Symfony\Component\HttpFoundation\Request;

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);
Symfony 4:
configuración
Servicios y
rutas
Principales archivos de configuración
Symfony 3 Symfony 4
" app/ " etc/
" config/ ! container.yaml
! config.yml ! routing.yaml
! routing.yml " packages/
! services.yml ! *.yaml
Principales archivos de configuración
Symfony 3 Symfony 4
" app/ " etc/
" config/ ! container.yaml
! config.yml ! routing.yaml
! routing.yml " packages/
! services.yml ! *.yaml
Principales archivos de configuración
Symfony 3 Symfony 4
" app/ " etc/
" config/ ! container.yaml
! config.yml ! routing.yaml
! routing.yml " packages/
! services.yml ! *.yaml
Bundles
Activar y desactivar bundles
Symfony 3 Symfony 4
" app/ " etc/
! AppKernel.php ! bundles.php
Los bundles se activan en etc/bundles.php
<?php

return [

'Symfony\Bundle\FrameworkBundle\FrameworkBundle' => ['all' => true],


'Symfony\Bundle\MonologBundle\MonologBundle' => ['all' => true],

'Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle' => ['all' => true],


'Doctrine\Bundle\DoctrineBundle\DoctrineBundle' => ['all' => true],

'Symfony\Bundle\WebProfilerBundle\WebProfilerBundle' => ['dev' => true, 'test' => true],


'Symfony\Bundle\TwigBundle\TwigBundle' => ['all' => true],
];
Los bundles se activan en etc/bundles.php
<?php

return [

'Symfony\Bundle\FrameworkBundle\FrameworkBundle' => ['all' => true],


'Symfony\Bundle\MonologBundle\MonologBundle' => ['all' => true],

'Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle' => ['all' => true],


'Doctrine\Bundle\DoctrineBundle\DoctrineBundle' => ['all' => true],

# TRUCO
'Symfony\Bundle\WebProfilerBundle\WebProfilerBundle' => ['dev' => true, 'test' => true],
'Symfony\Bundle\TwigBundle\TwigBundle' => ['all' => true],
]; Si usas Symfony Flex, los bundles se
activan y desactivan automáticamente.
Configuración por paquete/bundle
Symfony 3 Symfony 4
" app/ " etc/
" config/ " packages/
! config.yml ! doctrine.yaml
! framework.yaml
! security.yaml
! twig.yaml
! web_profiler.yaml
Reconfigurando la aplicación
app/config/config.yml etc/packages/twig.yaml
# ... twig:
debug: '%kernel.debug%'
twig:
strict_variables: '%kernel.debug%'
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'
etc/packages/doctrine.yaml
doctrine:
dbal: doctrine:
driver: pdo_mysql dbal:
driver: pdo_mysql
host: '%database_host%'
host: '%database_host%'
port: '%database_port%' port: '%database_port%'
dbname: '%database_name%' dbname: '%database_name%'
user: '%database_user%' user: '%database_user%'
password: '%database_password%' password: '%database_password%'
charset: UTF8
charset: UTF8 # ...
# ...

swiftmailer: etc/packages/swiftmailer.yaml
transport: '%mailer_transport%'
host: '%mailer_host%' swiftmailer:
username: '%mailer_user%' transport: '%mailer_transport%'
host: '%mailer_host%'
password: '%mailer_password%' username: '%mailer_user%'
spool: { type: memory } password: '%mailer_password%'
spool: { type: memory }
Cómo carga Symfony 4 la configuración
namespace App;

use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel 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');
}
}
Configuración por entorno
Symfony 3 Symfony 4
" app/ " etc/
" config/ " packages/
! config.yml ! *.yaml
! config_dev.yml " dev/
! config_prod.yml ! *.yaml
! config_test.yml " prod/
! *.yaml
" test/
! *.yaml
Variables de
entorno
Configuración de parámetros
Symfony 3 Symfony 4
" tu-proyecto/ " tu-proyecto/
" app/ ! .env
" config/ ! .env.dist
! parameters.yml
! parameters.yml.dist
Definiendo parámetros de configuración
Symfony 3 Symfony 4
parameters: APP_SECRET = f10a04dccf17d310bb91cf611d107343cb396
database_host: 127.0.0.1 DATABASE_URL = "mysql://root@127.0.0.1:3306/symfony"
database_port: null MAILER_URL = "smtp://localhost:25?encryption=&auth_mode="
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
Definiendo parámetros de configuración
Symfony 3 Symfony 4
parameters: APP_SECRET = f10a04dccf17d310bb91cf611d107343cb396
database_host: 127.0.0.1 DATABASE_URL = "mysql://root@127.0.0.1:3306/symfony"
database_port: null MAILER_URL = "smtp://localhost:25?encryption=&auth_mode="
database_name: symfony
database_user: root
database_password: null
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null $ CUIDADO
secret: f10a04dccf17d310bb91cf611d107343cb396

Todas las variables de entorno


son de tipo string.
Configuración con sintaxis DSN
Symfony 3 parameters:
database_host: 127.0.0.1
database_port: null
database_name: symfony
database_user: root
database_password: null

Symfony 4

DATABASE_URL = "mysql://root@127.0.0.1:3306/symfony"
Configurando el entorno y el debug
Symfony 3 Symfony 4
// web/app_dev.php # .env
$kernel = new AppKernel('dev', true); APP_ENV = dev
$request = Request::createFromGlobals();
// ...
APP_DEBUG = 1

// web/app.php
$kernel = new AppKernel('prod', false);
$request = Request::createFromGlobals();
// ...
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
Ejecutando comandos
# Symfony 3
$ ./bin/console foo:bar --env=prod —no-debug
$ SYMFONY_ENV=prod SYMFONY_DEBUG=0 ./bin/console foo:bar

# Symfony 4 # TRUCO
$ ./bin/console foo:bar La consola accede al
archivo .env para obtener el
valor de APP_DEBUG y APP_ENV
Symfony 4 será así por
defecto, pero ya puedes usar
todo esto en Symfony 3.3
gracias a Symfony Flex.
Symfony
Flex
Symfony Flex es la nueva
forma de crear y gestionar
aplicaciones Symfony.
Symfony Flex
• No es una versión especial de Symfony.

• Reemplaza al instalador de Symfony.

• No será estable hasta el lanzamiento de


Symfony 4, pero ya se puede usar.
• Su uso es OPCIONAL (incluso en Symfony 4)
Compatibilidad de Symfony Flex

SYMFONY
 SYMFONY
 SYMFONY
 SYMFONY
 SYMFONY


3.2 3.3 3.4 4.0 4.1


NO funciona SI funciona

Se usa por defecto


(pero sigue siendo opcional)
Instalando un paquete con Composer
$ composer require symfony/console
Instalando un paquete con Composer
$ composer require symfony/console

% &
packagist.org
&
github.com
Instalando un paquete con Composer
$ composer require symfony/console

% &
packagist.org
&
github.com
Instalando un paquete con Composer
$ composer require symfony/console

% &
packagist.org
&
github.com
Instalando un paquete con Composer
$ composer require symfony/console

% &
packagist.org
&
github.com
Instalando Flex en un proyecto existente

$ composer require symfony/flex


Instalando un paquete con Composer + Flex

$ composer require symfony/console


Instalando un paquete con Composer + Flex

$ composer require symfony/console

& % &
symfony.sh packagist.org
&
github.com
Instalando un paquete con Composer + Flex

$ composer require symfony/console

& % &
symfony.sh packagist.org
&
github.com
Instalando un paquete con Composer + Flex

$ composer require symfony/console

& % & &


symfony.sh
!
receta
packagist.org github.com
Instalando un paquete con Composer + Flex

$ composer require symfony/console

& % & &


symfony.sh
!
receta
packagist.org github.com
Instalando un paquete con Composer + Flex

$ composer require symfony/console

& % & &


symfony.sh
!
receta
packagist.org github.com
Instalando un paquete con Composer + Flex

$ composer require symfony/console

& % & &


symfony.sh
!
receta
packagist.org github.com
Instalando un paquete con Composer + Flex

$ composer require symfony/console

& % & &


symfony.sh
!
receta
packagist.org github.com
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 en acción Symfony Flex

$ 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
en la práctica
Ejemplo #1
Crear un nuevo
proyecto Symfony
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
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
Código PHP en vendor/

1,546 106,355
archivos líneas de código

*se incluyen todos los tests


Symfony 3.2 vs Symfony 3.3 + Flex

5,274 362,564
-70% -70%
1,546 106,355
archivos líneas de código
La edición estándar de Symfony
42 components Ldap Routing 4 bridges 11 bundles
Asset Dotenv OptionsResolver Security Doctrine Bridge Debug Bundle WebServer Bundle

BrowserKit EventDispatcher Polyfill APCu Serializer Monolog Bridge Distribution Bundle

Cache ExpressionLanguage Polyfill Intl ICU Stopwatch PHPUnit Bridge Framework Bundle

ClassLoader Filesystem Polyfill Mbstring Templating Twig Bridge FrameworkExtra Bundle

Config Finder Polyfill PHP 5.6 Translation 15 librerías Generator Bundle

Console Form Polyfill PHP 7.0 Validator Doctrine (11) Monolog Bundle

CssSelector HttpFoundation Polyfill Util VarDumper Monolog Security Bundle

Debug HttpKernel Process WebLink SecurityChecker SwiftMailer Bundle

DependencyInjection Inflector PropertyAccess Workflow ParamHandler Twig Bundle

DomCrawler Intl PropertyInfo Yaml SwiftMailer WebProfiler Bundle


Symfony Flex
15 components Routing 0 bridges 1 bundle
Dotenv

EventDispatcher

Cache Stopwatch Framework Bundle

ClassLoader Filesystem Polyfill Mbstring

Config Finder 2 librerías


Doctrine (1)

HttpFoundation Flex

Debug HttpKernel

DependencyInjection

Yaml
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"
},
}
SIN Symfony Flex CON Symfony Flex
SIN Symfony Flex CON Symfony Flex
Ejemplo #2
Instalar un bundle
de terceros
Instalando SncRedisBundle
Instalar SncRedisBundle SIN Flex (1/4)
$ composer require snc/redis-bundle
Instalar SncRedisBundle SIN Flex (2/4)
// app/AppKernel.php
use Symfony\Component\HttpKernel\Kernel;

class AppKernel extends Kernel


{
public function registerBundles()
{
$bundles = [
// ...
new Snc\RedisBundle\SncRedisBundle(),
];

// ...

return $bundles;
}

// ...
}
Instalar SncRedisBundle SIN Flex (3/4)
# app/config/parameters.yml
parameters:
REDIS_URL: "redis://localhost"
Instalar SncRedisBundle SIN Flex (4/4)
# app/config/config.yml
snc_redis:
clients:
default:
type: predis
alias: default
dsn: "%env(REDIS_URL)%"
Instalar SncRedisBundle CON Flex
$ composer require snc/redis-bundle
Instalar SncRedisBundle CON Flex
$ composer require snc/redis-bundle

¡YA ESTÁ!
Symfony Flex automatiza el proceso
• Flex activa el bundle en etc/bundles.php

• Flex define la variable de entorno


REDIS_URL en web/.env (y web/env.dist).
• Flex crea el archivo etc/packages/
snc_redis.yaml con la configuración inicial
Symfony Flex automatiza el proceso
• Cuando desinstalas el bundle, Symfony
Flex deshace todos los cambios anteriores.
Symfony Flex
=
Automatización
Recetas
Recetas de Symfony Flex
• Son las instrucciones que utiliza Flex para
automatizar las tareas.
• Están formadas por un archivo
manifest.json y, opcionalmente, otros
archivos y directorios.
Ejemplo de receta de SncRedisBundle (1/2)
{
"bundles": {
"Snc\\RedisBundle\\SncRedisBundle": ["all"]
},
"copy-from-recipe": {
"etc/": "%ETC_DIR%/"
},
"env": {
"#": "passwords that contain special characters (@, %, :, +) must be urlencoded",
"REDIS_URL": "redis://localhost"
}
}
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)%"
Repositorios de recetas
• github.com/symfony/recipes

El repositorio oficial. Por defecto Symfony Flex solo busca en
este repositorio.

• github.com/symfony/recipes-contrib

El repositorio de la comunidad. Para usarlo con Flex, ejecuta:
composer config extra.symfony.allow-contrib true
• Por el momento no se pueden crear recetas para paquetes
privados de tu propia empresa (se podrá en el futuro).
Otras ventajas
de usar Flex
No hace falta el nombre completo
$ composer require logger
No hace falta el nombre completo
$ composer require logger

1 ¿Es un "alias"?
log logging
MonologBundle = logs logger
monolog
Se han definido decenas de alias
$ composer require debug
$ composer require doctrine
$ composer require logger
$ composer require profiler
$ composer require server
$ composer require twig
No hace falta el nombre completo
$ composer require logger

1 ¿Es un "alias"?
2 ¿Existe el paquete symfony/xxxx?
No hace falta el nombre completo
$ composer require logger

1 ¿Es un "alias"?
2 ¿Existe el paquete symfony/xxxx?
3 ¿Existe el paquete xxxx?
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
Actualizando a
Symfony Flex
Symfony Flex solo funciona
si tu aplicación tiene una
determinada estructura de
directorios.
Estructura requerida por Symfony Flex
" etc/
! bundles.php
! container.yaml
! routing.yaml
" packages/
" src/
! Kernel.php
" .../
! .env
El proceso de actualización
• Por el momento, manual.

• Podría publicarse una herramienta


automática.
Actualiza tu infraestructura

PHP 7.1
requerido por Symfony Flex y Symfony 4
Paso 1: Crear una aplicación Flex nueva
$ composer create symfony/skeleton mi-proyecto-flex
Paso 2: Añade tus dependencias
composer.json de tu proyecto composer.json del nuevo proyecto
"require": { "require": {
"doctrine/doctrine-cache-bundle": "^1.2", "php": "^7.1.3",
"dropbox/dropbox-sdk": "^1.1", "symfony/flex": "^1.0",
"easycorp/easy-log-handler": "^1.0",
"symfony/framework-bundle": "^3.3",
"erusev/parsedown": "~1.5",
"symfony/yaml": "^3.3"
"guzzlehttp/guzzle": "^6.0",
"knplabs/github-api": "~1.2",

"...": "...",

},
"white-october/pagerfanta-bundle": "~1.0"
"require-dev": {
},
"symfony/dotenv": "^3.3"
"require-dev": {
"...": "...",
},

},
Paso 3: instala las dependencias
$ cd tu-proyecto/
$ composer install
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
Paso 4: Retoca la configuración si hace falta
Comprueba los contenidos de config.yml,
config_dev.yml y config_prod.yml y copia la
configuración que haga falta en los nuevos
archivos etc/packages/*.yaml
Paso 4: Retoca la configuración si hace falta
Comprueba los contenidos de config.yml,
config_dev.yml y config_prod.yml y copia la
configuración que haga falta en los nuevos
archivos etc/packages/*.yaml
$ CUIDADO
Esta es la parte más aburrida y
donde más fácilmente se pueden
cometer errores.
Paso 5: Mueve tu código a src/
• Mejor caso: todo tu código está en AppBundle

Copia el código directamente en src/ y cambia el
namespace de AppBundle\ a App\ con PHPStorm

• Peor caso: tienes muchos bundles



Puedes mantenerlos (cambiando el namespace a App\)
pero deberías ir planteándote eliminarlos
Paso 6: Mueve tus plantillas
• Mejor caso: plantillas en app/Resources/views/

Cópialas directamente en templates/

• Peor caso: plantillas en otros directorios



Puedes mantenerlos actualizando la configuración de Twig
# etc/packages/twig.yaml
twig:
paths: ['%kernel.project_dir%/templates']
# ...
Silex
Silex
está muerto
¿Por qué usas Silex en vez de Symfony?
• Más rendimiento

• Menos código

• Menos dependencias

• Menos configuración
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 (
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 (
Mi consejo
• No uséis Silex para nuevos proyectos.

• Considerad vuestros proyectos Silex


existentes como "legacy".
• Preparad un plan de actualización a
Symfony Flex.
En resumen
Symfony 4
Mantiene todo lo que te
gusta, pero elimina lo que a
la mayoría no le gusta
(bundles, configuración, etc.)
Symfony 4
Por defecto crea micro-
aplicaciones con un 70%
menos de código que
Symfony 3.
Symfony 4
Se integrará más
fácilmente con servicios y
tecnologías populares.
Symfony Flex
Automatiza las tareas más
habituales de las
aplicaciones Symfony.
Symfony Flex
Es la mejor manera de
probar ya mismo lo que nos
traerá Symfony 4 en
Noviembre.
Contacto
Contacto
• javier.eguiluz@sensiolabs.com

• github.com/javiereguiluz

• linkedin.com/in/javiereguiluz

También podría gustarte