desymfony 2017: symfony 4, symfony flex y el futuro de symfony

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

Upload: javier-eguiluz

Post on 22-Jan-2018

9.787 views

Category:

Technology


1 download

TRANSCRIPT

deSymfony 30 junio - 1 julio 2017 Castellón

SYMFONY 4, SYMFONY FLEX Y EL FUTURO DE SYMFONYJavier Eguiluz

deSymfony

¡Muchas gracias a nuestrospatrocinadores!

Licencia de esta presentación

creativecommons.org/licenses/by-nc-sa/3.0

Me presento

Javier Eguiluzformador 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

IoTIA

ASR & NLUAR

CloudAPI 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.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

Assets generados por Webpack Encore" web/ " build/ " css/ ! app.css " js/ ! app.js

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>

Configuración para los assets de Symfony DemoWebpack 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.xSYMFONY

2.xSYMFONY

3.xSYMFONY

4.x

La filosofía de Symfony

SYMFONY

1.xSYMFONY

2.xSYMFONY

3.xSYMFONY

4.x

Monolito mágico

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

MicroserviciosAplicaciones

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

Código PHP en vendor/

*se incluyen todos los tests

362,5645,274archivos 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

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

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

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

$ 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,546archivos líneas de código

Symfony 3.2 vs Symfony 3.3 + Flex

106,3551,546archivos 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

¡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-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).

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

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

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.1requerido 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 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']

# ...

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 4Mantiene todo lo que te

gusta, pero elimina lo que a la mayoría no le gusta

(bundles, configuración, etc.)

Symfony 4Por defecto crea micro-

aplicaciones con un 70% menos de código que

Symfony 3.

Symfony 4Se integrará más

fácilmente con servicios y tecnologías populares.

Symfony FlexAutomatiza 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