deSymfony 30 junio - 1 julio 2017 Castellón
SYMFONY 4, SYMFONY FLEX Y EL FUTURO DE SYMFONYJavier Eguiluz
Licencia de esta presentación
creativecommons.org/licenses/by-nc-sa/3.0
Agenda• ¿Que cambios traerá Symfony 4? • ¿Qué es Symfony Flex? • ¿Cómo me preparo para Symfony 4 y Flex?
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
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)
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.
¿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.
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.jsvar 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.scssimport '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
Paso 5: enlazar los assets en las plantillasframework:
# ...
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>
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.
La filosofía de Symfony
SYMFONY
1.xSYMFONY
2.xSYMFONY
3.xSYMFONY
4.x
Monolito mágico
Monolito +
Componentes desacoplados
La filosofía de Symfony
SYMFONY
1.xSYMFONY
2.xSYMFONY
3.xSYMFONY
4.x
Monolito mágico
Monolito +
Componentes desacoplados
Monolito +
Micro +
Componentes desacoplados
La filosofía de Symfony
SYMFONY
1.xSYMFONY
2.xSYMFONY
3.xSYMFONY
4.x
Monolito mágico
Monolito +
Componentes desacoplados
Monolito +
Micro +
Componentes desacoplados
Plataforma +
Micro +
Componentes desacoplados
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
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 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,389 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.phpuse 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.phpuse 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
Se mantiene todo lo que ya conoces• Comandos • Controladores • Plantillas • Entidades y repositorios • Event subscribers
• Extensiones de Twig
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/)
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 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.
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);
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
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ónnamespace 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
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 4APP_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 4APP_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 DSNparameters:
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• 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.2SYMFONY
3.3SYMFONY
3.4SYMFONY
4.0SYMFONY
4.1
NO funciona SI funciona
Se usa por defecto (pero sigue siendo opcional)
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
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
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"
},
}
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)%"
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.
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-contribEl 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).
No hace falta el nombre completo
$ composer require logger
¿Es un "alias"?1
MonologBundlelog
loggerlogging
logsmonolog
=
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
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.
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
# 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 faltaComprueba 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 faltaComprueba 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 bundlesPuedes 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 directoriosPuedes mantenerlos actualizando la configuración de Twig# etc/packages/twig.yaml
twig:
paths: ['%kernel.project_dir%/templates']
# ...
¿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.
Symfony 4Mantiene todo lo que te
gusta, pero elimina lo que a la mayoría no le gusta
(bundles, configuración, etc.)
Contacto• [email protected] • github.com/javiereguiluz • linkedin.com/in/javiereguiluz