Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SYMFONY FLEX
Y EL FUTURO DE SYMFONY
Javier Eguiluz
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?
• PSR-3 (logs)
• PSR-6 (cache)
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.
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.
Symfony
PHP
Composer
Symfony + Webpack Encore
Webpack Encore
Symfony
Webpack
PHP Node.js
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.)
• Siempre opcional
Preparing project...
Aplicaciones
web
Microservicios
API
La edición estándar abarca todo
Cache ExpressionLanguage Polyfill Intl ICU Stopwatch PHPUnit Bridge Framework Bundle
Console Form Polyfill PHP 7.0 Validator Doctrine (11) Monolog Bundle
Cache ExpressionLanguage Polyfill Intl ICU Stopwatch PHPUnit Bridge Framework Bundle
34,389
ClassLoader Filesystem Polyfill Mbstring Templating Twig Bridge FrameworkExtra Bundle
Console Form Form Polyfill PHP 7.0 Validator Doctrine (11) Monolog Bundle
5,274 362,564
archivos líneas de código
Monolitos Micro-
por defecto aplicaciones
por defecto
Micro-
aplicaciones Monolitos
si quieres si quieres
ANTES: app/AppKernel.php
use Symfony\Component\HttpKernel\Kernel;
• 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.
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
"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';
// ...
require __DIR__.'/../vendor/autoload.php';
// ...
return [
return [
# 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;
// ...
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.
% &
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
& % &
symfony.sh packagist.org
&
github.com
Instalando un paquete con Composer + Flex
& % &
symfony.sh packagist.org
&
github.com
Instalando un paquete con Composer + Flex
' 10 segundos
✔ Symfony 3.3.2 was successfully installed. Now you can:
' 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
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
Cache ExpressionLanguage Polyfill Intl ICU Stopwatch PHPUnit Bridge Framework Bundle
Console Form Polyfill PHP 7.0 Validator Doctrine (11) Monolog Bundle
EventDispatcher
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;
// ...
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
• 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
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
• 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.
• github.com/javiereguiluz
• linkedin.com/in/javiereguiluz