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

13,235 views 34 slides Jul 05, 2017
Slide 1
Slide 1 of 188
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92
Slide 93
93
Slide 94
94
Slide 95
95
Slide 96
96
Slide 97
97
Slide 98
98
Slide 99
99
Slide 100
100
Slide 101
101
Slide 102
102
Slide 103
103
Slide 104
104
Slide 105
105
Slide 106
106
Slide 107
107
Slide 108
108
Slide 109
109
Slide 110
110
Slide 111
111
Slide 112
112
Slide 113
113
Slide 114
114
Slide 115
115
Slide 116
116
Slide 117
117
Slide 118
118
Slide 119
119
Slide 120
120
Slide 121
121
Slide 122
122
Slide 123
123
Slide 124
124
Slide 125
125
Slide 126
126
Slide 127
127
Slide 128
128
Slide 129
129
Slide 130
130
Slide 131
131
Slide 132
132
Slide 133
133
Slide 134
134
Slide 135
135
Slide 136
136
Slide 137
137
Slide 138
138
Slide 139
139
Slide 140
140
Slide 141
141
Slide 142
142
Slide 143
143
Slide 144
144
Slide 145
145
Slide 146
146
Slide 147
147
Slide 148
148
Slide 149
149
Slide 150
150
Slide 151
151
Slide 152
152
Slide 153
153
Slide 154
154
Slide 155
155
Slide 156
156
Slide 157
157
Slide 158
158
Slide 159
159
Slide 160
160
Slide 161
161
Slide 162
162
Slide 163
163
Slide 164
164
Slide 165
165
Slide 166
166
Slide 167
167
Slide 168
168
Slide 169
169
Slide 170
170
Slide 171
171
Slide 172
172
Slide 173
173
Slide 174
174
Slide 175
175
Slide 176
176
Slide 177
177
Slide 178
178
Slide 179
179
Slide 180
180
Slide 181
181
Slide 182
182
Slide 183
183
Slide 184
184
Slide 185
185
Slide 186
186
Slide 187
187
Slide 188
188

About This Presentation

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.


Slide Content

deSymfony
30 junio - 1 julio 2017
Castellón
SYMFONY 4,
SYMFONY FLEX
Y EL FUTURO DE SYMFONY
Javier Eguiluz

deSymfony
¡Muchas gracias a nuestros
patrocinadores!

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
Mayo
2017
Symfony
3.3 y Flex
Noviembre
2017
Symfony
3.4 y 4.0
Junio
2017
deSymfony

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

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
IA
ASR
& NLUAR

Cloud
API
first
Isomorphic
apps
Serverless
Se replantea la utilidad
de los frameworks

¿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
Componente

Cache
APCu
Memcache
Doctrine Cache
Redis

Nuevos componentes
Componente

Lock
PHP flock
Memcache
PHP Semaphore
Redis

Nuevos componentes
Componente

WebLink
HTML 5 Link
HTML 5 Preload
Cloudflare
HTTP/2

Nuevos componentes
Componente

AMQP RabbitMQ
Componente

Worker

Nuevos componentes
Componente

????
Gulp
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
Composer
PHP
Symfony

Symfony + Webpack Encore
yarn / npm
Node.js
Webpack
Webpack Encore
Composer
PHP
Symfony

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
@import "~bootstrap-sass";
body {
color: $primary-color;
// ...
}
assets/app.scss
import 'jquery';
import 'bootstrap-sass';
window.addEventListener('load', function () {
// ...
});
assets/app.js

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

1.x
SYMFONY

2.x
SYMFONY

3.x
SYMFONY

4.x

La filosofía de Symfony
SYMFONY

1.x
SYMFONY

2.x
SYMFONY

3.x
SYMFONY

4.x
Monolito
mágico

La filosofía de Symfony
SYMFONY

1.x
SYMFONY

2.x
SYMFONY

3.x
SYMFONY

4.x
Monolito
mágico
Monolito
+
Componentes
desacoplados

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

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

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
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%

La edición estándar de Symfony

Cada tipo de aplicación tiene sus necesidades
Microservicios
Aplicaciones
web
API

La edición estándar abarca todo
Edición estándar de Symfony

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

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 Bundle Doctrine 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 bundles 42 components SwiftMailer ¿Usas todo lo que incluye la edición estándar?
Form34,389
líneas de código

Código PHP en vendor/
*se incluyen todos los tests
362,5645,274
archivos líneas de código

Symfony 1, 2, 3 Symfony 4
Micro-
aplicaciones
por defecto
Monolitos
si quieres
Monolitos
por defecto
Micro-
aplicaciones
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
" 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

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

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
" src/
" CartBundle/
" Controller/
! DefaultController.php
" ProductBundle/
" Controller/
! DefaultController.php
" UserBundle/
" Controller/
! DefaultController.php
Symfony 3
" src/
" AppBundle/
" Controller/
! CartController.php
! ProductController.php
! UserController.php

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

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
{
"...": "...",
"autoload": {
"psr-4": { "App\": "src/" }
},
"autoload-dev": {
"psr-4": { "App\Tests\": "tests/" }
}
}
composer.json

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.

Controlador
frontal
es
es

Symfony 3
" web/
! app.php
! app_dev.php
! apple-touch-icon.png
! config.php
! favicon.ico
! robots.txt
Symfony 4
" web/
! index.php

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
" app/
" config/
! config.yml
! routing.yml
! services.yml
Symfony 3 Symfony 4
" etc/
! container.yaml
! routing.yaml
" packages/
! *.yaml

Principales archivos de configuración
" app/
" config/
! config.yml
! routing.yml
! services.yml
Symfony 3 Symfony 4
" etc/
! container.yaml
! routing.yaml
" packages/
! *.yaml

Principales archivos de configuración
" app/
" config/
! config.yml
! routing.yml
! services.yml
Symfony 3 Symfony 4
" etc/
! container.yaml
! routing.yaml
" packages/
! *.yaml

Bundles

Activar y desactivar bundles
" app/
! AppKernel.php
Symfony 3 Symfony 4
" etc/
! 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],
'Symfony\Bundle\WebProfilerBundle\WebProfilerBundle' => ['dev' => true, 'test' => true],
'Symfony\Bundle\TwigBundle\TwigBundle' => ['all' => true],
];
# TRUCO
Si usas Symfony Flex, los bundles se
activan y desactivan automáticamente.

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

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

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
" 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

Variables de
entorno

Configuración de parámetros
" tu-proyecto/
" app/
" config/
! parameters.yml
! parameters.yml.dist
Symfony 3 Symfony 4
" tu-proyecto/
! .env
! .env.dist

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://[email protected]:3306/symfony"
MAILER_URL = "smtp://localhost:25?encryption=&auth_mode="

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://[email protected]:3306/symfony"
MAILER_URL = "smtp://localhost:25?encryption=&auth_mode="
$ CUIDADO
Todas las variables de entorno
son de tipo string.

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://[email protected]:3306/symfony"

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

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
$ ./bin/console foo:bar
# TRUCO
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

3.2
SYMFONY

3.3
SYMFONY

3.4
SYMFONY

4.0
SYMFONY

4.1
NO funcionaSI 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
% &
github.com
&
packagist.org

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

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

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

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
% &
github.com
&
packagist.org
&
symfony.sh

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

Instalando un paquete con Composer + Flex
$ composer require symfony/console
% &
github.com
&
packagist.org
&
symfony.sh
!
receta

Instalando un paquete con Composer + Flex
$ composer require symfony/console
% &
github.com
&
packagist.org
&
symfony.sh
!
receta

Instalando un paquete con Composer + Flex
$ composer require symfony/console
% &
github.com
&
packagist.org
&
symfony.sh
!
receta

Instalando un paquete con Composer + Flex
$ composer require symfony/console
% &
github.com
&
packagist.org
&
symfony.sh
!
receta

Instalando un paquete con Composer + Flex
$ composer require symfony/console
% &
github.com
&
packagist.org
&
symfony.sh
!
receta

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
$ 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

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/
*se incluyen todos los tests
106,3551,546
archivos líneas de código

Symfony 3.2 vs Symfony 3.3 + Flex
106,3551,546
archivos líneas de código
362,5645,274
-70% -70%

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

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

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
¡YAESTÁ!

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
¿Es un "alias"?1
MonologBundle
log
logger
logging
logs
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
¿Es un "alias"?1
¿Existe el paquete symfony/xxxx?2

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

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
"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"
},

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.

Es la mejor manera de
probar ya mismo lo que nos
traerá Symfony 4 en
Noviembre.
Symfony Flex

Contacto

Contacto
[email protected]
•github.com/javiereguiluz
•linkedin.com/in/javiereguiluz