SlideShare a Scribd company logo
1 of 188
Download to read offline
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
JavierEguiluz
formadoryevangelizador
deSymfony
Agenda
Agenda
• ¿QuecambiostraeráSymfony4?
• ¿QuéesSymfonyFlex?
• ¿CómomepreparoparaSymfony4yFlex?
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
Symfonysiguesiendo
relevante10añosdespués
desulanzamiento.
El framework más estándar
• PSR-2(sintaxisdecódigo)
• PSR-3(logs)
• PSR-4(cargaautomáticadeclases)
• PSR-6(cache)
• PSR-7(mensajesHTTP)(*soporteparcial)
• PSR-11(contenedoresdeservicios)
• PSR-16(cachésimplificada)
Seguimos creciendo
DescargasdiariasdelframeworkSymfony
Seguimos creciendo
DescargastotalesdeloscomponentesSymfony
Lo malo
Eselmomentomáscrucial
delahistoriadeSymfony
Elcambiotecnológicose
estáacelerando
IoT
IA
ASR
&NLUAR
Cloud
API
first
Isomorphic
apps
Serverless
Sereplantealautilidad
delosframeworks
¿Quétienequehacer
Symfonyparaseguirsiendo
relevanteenlospróximos5
años?
Integración
Un framework de bajo nivel
• Conlosaños,Symfonysehaido
convirtiendoenunframeworkdebajonivel.
• EstamosmáscercadePHPquedeofrecer
funcionalidadescompletas.
• Noesalgomalo,siemprequeincluyas
tambiénutilidadesdealtonivel.
Ejemplos de integraciones
• ElloggerintegralalibreríaMonolog.
• ElmailerpermiteusarGmailfácilmente.
• Losformulariosincluyentemaspara
BootstrapyFoundation.
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?
• Lanuevaherramientaoficialparagestionar
assetsweb(CSS,JavaScript,fuentes,
imágenes)
• ReemplazaaAssetic.
Webpack Encore por dentro
• EstáprogramadoconJavaScript,noPHP.
• InternamentehaceusodeWebpack.
• Encorees"simplemente"unaformasencilla
deconfigurarWebpack.
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
• Soportatodoloqueseusaenaplicaciones
front-endmodernas(preprocessors,PostCSS,
React,Babel,VUE,sourcemaps,versioning,CDNs,hot
modulereplacements,etc.)
• Tambiénsirveparaaplicacionesclásicaso
sencillas(e.j.BootstrapyjQuery)
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ónsimpledetecnologías(e.g.
Webpack,Bootstrap) yservicios(AWS,GoogleCloud,Stripe,
Mailgun,etc.)
• SinreinventarAPIsointroducirnuevosconceptos
• Siempreopcional
• Todavíaestamospensandoencómohacerlo.
Symfony 4:
la filosofía
Enelámbitotecnológicosolo
haydosopciones:cambiaro
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
Symfony4seráelmayor
cambiodelahistoriade
Symfony
Symfony 1, 2, 3 Symfony 4
• Aplicacionesweb













• Aplicacionesweb
• Microservicios
• APIs
• Aplicacionesdeconsola



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 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,389lí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
pordefecto
Monolitos
siquieres
Monolitos
pordefecto
Micro-
aplicaciones
siquieres
ANTES: app/AppKernel.php
use SymfonyComponentHttpKernelKernel;
class AppKernel extends Kernel
{
public function registerBundles();
public function getCacheDir();
public function getLogDir();
public function registerContainerConfiguration(LoaderInterface $loader);
}
AHORA: src/Kernel.php
use SymfonyBundleFrameworkBundleKernelMicroKernelTrait;
use SymfonyComponentHttpKernelKernel 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
• SymfonyStandardEdition
• SymfonyFull-StackFramework
• DistribucionesSymfony
• SensioDistributionBundle
Symfony 4:
estructura
Se mantiene todo lo que ya conoces
• Comandos
• Controladores
• Plantillas
• Entidadesyrepositorios
• Eventsubscribers
• ExtensionesdeTwig
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"yfácildenavegar.
• Centralizacontenidosmanejadospor
personasajenasalbackend(assets/,templates/)
• DesacopladodeSymfony(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
Elcódigodelasaplicaciones
yanosedivideenbundles.
El código se define bajo el namespace App
// src/Controller/UserController.php
namespace App;
use SymfonyBundleFrameworkBundleControllerController;
class UserController extends Controller
{
// ...
}
Los dos namespaces definidos por defecto
{
"...": "...",
"autoload": {
"psr-4": { "App": "src/" }
},
"autoload-dev": {
"psr-4": { "AppTests": "tests/" }
}
}
composer.json
Alternativas para seguir usando bundles
• Convertirlosbundlesdetuaplicaciónen"third-
partybundles"einstalarlosmedianteComposer
• UsarlosnamespacesdePHPparasimularla
separaciónmodulardecódigo.
• Nohacernadayasumirquelosbundleshan
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 AppKernel;
use SymfonyComponentHttpFoundationRequest;
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 AppKernel;
use SymfonyComponentHttpFoundationRequest;
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 [
'SymfonyBundleFrameworkBundleFrameworkBundle' => ['all' => true],
'SymfonyBundleMonologBundleMonologBundle' => ['all' => true],
'DoctrineBundleDoctrineCacheBundleDoctrineCacheBundle' => ['all' => true],
'DoctrineBundleDoctrineBundleDoctrineBundle' => ['all' => true],
'SymfonyBundleWebProfilerBundleWebProfilerBundle' => ['dev' => true, 'test' => true],
'SymfonyBundleTwigBundleTwigBundle' => ['all' => true],
];
Los bundles se activan en etc/bundles.php
<?php
return [
'SymfonyBundleFrameworkBundleFrameworkBundle' => ['all' => true],
'SymfonyBundleMonologBundleMonologBundle' => ['all' => true],
'DoctrineBundleDoctrineCacheBundleDoctrineCacheBundle' => ['all' => true],
'DoctrineBundleDoctrineBundleDoctrineBundle' => ['all' => true],
'SymfonyBundleWebProfilerBundleWebProfilerBundle' => ['dev' => true, 'test' => true],
'SymfonyBundleTwigBundleTwigBundle' => ['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 SymfonyBundleFrameworkBundleKernelMicroKernelTrait;
use SymfonyComponentConfigLoaderLoaderInterface;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentHttpKernelKernel 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://root@127.0.0.1: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://root@127.0.0.1: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://root@127.0.0.1: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
Symfony4seráasípor
defecto,peroyapuedesusar
todoestoenSymfony3.3
graciasaSymfonyFlex.
Symfony
Flex
SymfonyFlexeslanueva
formadecrearygestionar
aplicacionesSymfony.
Symfony Flex
• NoesunaversiónespecialdeSymfony.
• ReemplazaalinstaladordeSymfony.
• Noseráestablehastaellanzamientode
Symfony4,peroyasepuedeusar.
• SuusoesOPCIONAL(inclusoenSymfony4)
Compatibilidad de Symfony Flex
SYMFONY

3.2
SYMFONY

3.3
SYMFONY

3.4
SYMFONY

4.0
SYMFONY

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.compackagist.org
Instalando un paquete con Composer
$ composer require symfony/console
github.compackagist.org
Instalando un paquete con Composer
$ composer require symfony/console
github.compackagist.org
Instalando un paquete con Composer
$ composer require symfony/console
github.compackagist.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.compackagist.orgsymfony.sh
Instalando un paquete con Composer + Flex
$ composer require symfony/console
github.compackagist.orgsymfony.sh
Instalando un paquete con Composer + Flex
$ composer require symfony/console
github.compackagist.orgsymfony.sh
receta
Instalando un paquete con Composer + Flex
$ composer require symfony/console
github.compackagist.orgsymfony.sh
receta
Instalando un paquete con Composer + Flex
$ composer require symfony/console
github.compackagist.orgsymfony.sh
receta
Instalando un paquete con Composer + Flex
$ composer require symfony/console
github.compackagist.orgsymfony.sh
receta
Instalando un paquete con Composer + Flex
$ composer require symfony/console
github.compackagist.orgsymfony.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 SymfonyComponentHttpKernelKernel;
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = [
// ...
new SncRedisBundleSncRedisBundle(),
];
// ...
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
• Flexactivaelbundleenetc/bundles.php
• Flexdefinelavariabledeentorno
REDIS_URLenweb/.env(yweb/env.dist).
• Flexcreaelarchivoetc/packages/
snc_redis.yamlconlaconfiguracióninicial
Symfony Flex automatiza el proceso
• Cuandodesinstalaselbundle,Symfony
Flexdeshacetodosloscambiosanteriores.
SymfonyFlex
=
Automatización
Recetas
Recetas de Symfony Flex
• SonlasinstruccionesqueutilizaFlexpara
automatizarlastareas.
• Estánformadasporunarchivo
manifest.jsony,opcionalmente,otros
archivosydirectorios.
Ejemplo de receta de SncRedisBundle (1/2)
{
"bundles": {
"SncRedisBundleSncRedisBundle": ["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

Elrepositoriooficial.PordefectoSymfonyFlexsolobuscaen
esterepositorio.
• github.com/symfony/recipes-contrib

Elrepositoriodelacomunidad.ParausarloconFlex,ejecuta:
composerconfigextra.symfony.allow-contribtrue
• Porelmomentonosepuedencrearrecetasparapaquetes
privadosdetupropiaempresa(sepodráenelfuturo).
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
SymfonyFlexsolofunciona
situaplicacióntieneuna
determinadaestructurade
directorios.
Estructura requerida por Symfony Flex
etc/
bundles.php
container.yaml
routing.yaml
packages/
src/
Kernel.php
.../
.env
El proceso de actualización
• Porelmomento,manual.
• Podríapublicarseunaherramienta
automática.
Actualiza tu infraestructura
PHP7.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
Compruebaloscontenidosdeconfig.yml,
config_dev.ymlyconfig_prod.ymlycopiala
configuraciónquehagafaltaenlosnuevos
archivosetc/packages/*.yaml
Paso 4: Retoca la configuración si hace falta
Compruebaloscontenidosdeconfig.yml,
config_dev.ymlyconfig_prod.ymlycopiala
configuraciónquehagafaltaenlosnuevos
archivosetc/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/
• Mejorcaso:todotucódigoestáenAppBundle

Copiaelcódigodirectamenteensrc/ycambiael
namespacedeAppBundleaAppconPHPStorm
• Peorcaso:tienesmuchosbundles

Puedesmantenerlos(cambiandoelnamespaceaApp)
perodeberíasirplanteándoteeliminarlos
Paso 6: Mueve tus plantillas
• Mejorcaso:plantillasenapp/Resources/views/

Cópialasdirectamenteentemplates/
• Peorcaso:plantillasenotrosdirectorios

PuedesmantenerlosactualizandolaconfiguracióndeTwig
# etc/packages/twig.yaml
twig:
paths: ['%kernel.project_dir%/templates']
# ...
Silex
Silex
estámuerto
¿Por qué usas Silex en vez de Symfony?
• Másrendimiento
• Menoscódigo
• Menosdependencias
• Menosconfiguració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
• NouséisSilexparanuevosproyectos.
• ConsideradvuestrosproyectosSilex
existentescomo"legacy".
• Preparadunplandeactualizacióna
SymfonyFlex.
En resumen
Symfony4
Mantienetodoloquete
gusta,peroeliminaloquea
lamayoríanolegusta
(bundles,configuración,etc.)
Symfony4
Pordefectocreamicro-
aplicacionesconun70%
menosdecódigoque
Symfony3.
Symfony4
Seintegrarámás
fácilmenteconserviciosy
tecnologíaspopulares.
SymfonyFlex
Automatizalastareasmás
habitualesdelas
aplicacionesSymfony.
Eslamejormanerade
probaryamismoloquenos
traeráSymfony4en
Noviembre.
SymfonyFlex
Contacto
Contacto
• javier.eguiluz@sensiolabs.com
• github.com/javiereguiluz
• linkedin.com/in/javiereguiluz
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony

More Related Content

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

Presentacion Symfony2 ADWE Alicante
Presentacion Symfony2 ADWE AlicantePresentacion Symfony2 ADWE Alicante
Presentacion Symfony2 ADWE AlicanteADWE Team
 
Symfony plugins - decharlas
Symfony plugins - decharlasSymfony plugins - decharlas
Symfony plugins - decharlasDecharlas
 
Symfony en la gestión de un centro de computación avanzada
Symfony en la gestión de un centro de computación avanzadaSymfony en la gestión de un centro de computación avanzada
Symfony en la gestión de un centro de computación avanzadaCésar Suárez Ortega
 
Caso práctico II: symfony en la gestión de un centro de computación avanzada ...
Caso práctico II: symfony en la gestión de un centro de computación avanzada ...Caso práctico II: symfony en la gestión de un centro de computación avanzada ...
Caso práctico II: symfony en la gestión de un centro de computación avanzada ...Decharlas
 
Symfony2, Jornadas Symfony
Symfony2, Jornadas SymfonySymfony2, Jornadas Symfony
Symfony2, Jornadas SymfonyJavier Eguiluz
 
Symfony 2 - decharlas 2010
Symfony 2 - decharlas 2010Symfony 2 - decharlas 2010
Symfony 2 - decharlas 2010Decharlas
 
Adentrándonos al Framework Symfony
Adentrándonos al  Framework SymfonyAdentrándonos al  Framework Symfony
Adentrándonos al Framework SymfonyRodrigo Miranda
 
Presentacion Sergio Viteri (Voota) decharlas/s
Presentacion Sergio Viteri (Voota) decharlas/sPresentacion Sergio Viteri (Voota) decharlas/s
Presentacion Sergio Viteri (Voota) decharlas/sSergio Viteri
 
Caso práctico symfony: voota.es - decharlas
Caso práctico symfony: voota.es - decharlasCaso práctico symfony: voota.es - decharlas
Caso práctico symfony: voota.es - decharlasDecharlas
 
Joinea - mongoDB en php y Symfony2
Joinea - mongoDB en php y Symfony2Joinea - mongoDB en php y Symfony2
Joinea - mongoDB en php y Symfony2sergiovier
 

Similar to deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony (14)

Presentacion Symfony2 ADWE Alicante
Presentacion Symfony2 ADWE AlicantePresentacion Symfony2 ADWE Alicante
Presentacion Symfony2 ADWE Alicante
 
Symfony plugins - decharlas
Symfony plugins - decharlasSymfony plugins - decharlas
Symfony plugins - decharlas
 
Symfony dagrinchi
Symfony dagrinchiSymfony dagrinchi
Symfony dagrinchi
 
Symfony Parte 3
Symfony Parte 3Symfony Parte 3
Symfony Parte 3
 
Symfony en la gestión de un centro de computación avanzada
Symfony en la gestión de un centro de computación avanzadaSymfony en la gestión de un centro de computación avanzada
Symfony en la gestión de un centro de computación avanzada
 
Caso práctico II: symfony en la gestión de un centro de computación avanzada ...
Caso práctico II: symfony en la gestión de un centro de computación avanzada ...Caso práctico II: symfony en la gestión de un centro de computación avanzada ...
Caso práctico II: symfony en la gestión de un centro de computación avanzada ...
 
Symfony2, Jornadas Symfony
Symfony2, Jornadas SymfonySymfony2, Jornadas Symfony
Symfony2, Jornadas Symfony
 
Symfony 2 - decharlas 2010
Symfony 2 - decharlas 2010Symfony 2 - decharlas 2010
Symfony 2 - decharlas 2010
 
Adentrándonos al Framework Symfony
Adentrándonos al  Framework SymfonyAdentrándonos al  Framework Symfony
Adentrándonos al Framework Symfony
 
Presentacion Sergio Viteri (Voota) decharlas/s
Presentacion Sergio Viteri (Voota) decharlas/sPresentacion Sergio Viteri (Voota) decharlas/s
Presentacion Sergio Viteri (Voota) decharlas/s
 
Caso práctico symfony: voota.es - decharlas
Caso práctico symfony: voota.es - decharlasCaso práctico symfony: voota.es - decharlas
Caso práctico symfony: voota.es - decharlas
 
Introducción a Silex
Introducción a SilexIntroducción a Silex
Introducción a Silex
 
Joinea - mongoDB en php y Symfony2
Joinea - mongoDB en php y Symfony2Joinea - mongoDB en php y Symfony2
Joinea - mongoDB en php y Symfony2
 
Symfony
SymfonySymfony
Symfony
 

More from Javier Eguiluz

New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)Javier Eguiluz
 
Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)Javier Eguiluz
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricksJavier Eguiluz
 
Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Javier Eguiluz
 
Silex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPSilex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPJavier Eguiluz
 
Twig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasTwig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasJavier Eguiluz
 
Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)Javier Eguiluz
 
Desymfony 2012 - Concurso de diseño
Desymfony 2012 - Concurso de diseñoDesymfony 2012 - Concurso de diseño
Desymfony 2012 - Concurso de diseñoJavier Eguiluz
 
Desymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: BackendDesymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: BackendJavier Eguiluz
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosJavier Eguiluz
 
Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2Javier Eguiluz
 
Curso Symfony - Anexos
Curso Symfony - AnexosCurso Symfony - Anexos
Curso Symfony - AnexosJavier Eguiluz
 
Curso Symfony - Clase 5
Curso Symfony - Clase 5Curso Symfony - Clase 5
Curso Symfony - Clase 5Javier Eguiluz
 
Curso Symfony - Clase 4
Curso Symfony - Clase 4Curso Symfony - Clase 4
Curso Symfony - Clase 4Javier Eguiluz
 
Curso Symfony - Clase 3
Curso Symfony - Clase 3Curso Symfony - Clase 3
Curso Symfony - Clase 3Javier Eguiluz
 

More from Javier Eguiluz (20)

New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
 
Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricks
 
Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8
 
Silex al límite
Silex al límiteSilex al límite
Silex al límite
 
Twig tips and tricks
Twig tips and tricksTwig tips and tricks
Twig tips and tricks
 
Silex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPSilex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHP
 
Twig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasTwig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadas
 
Wallpaper Notifier
Wallpaper NotifierWallpaper Notifier
Wallpaper Notifier
 
Backend (sf2Vigo)
Backend (sf2Vigo)Backend (sf2Vigo)
Backend (sf2Vigo)
 
Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)
 
Desymfony 2012 - Concurso de diseño
Desymfony 2012 - Concurso de diseñoDesymfony 2012 - Concurso de diseño
Desymfony 2012 - Concurso de diseño
 
Desymfony 2011 - Twig
Desymfony 2011 - TwigDesymfony 2011 - Twig
Desymfony 2011 - Twig
 
Desymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: BackendDesymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: Backend
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
 
Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2Desymfony 2011 - Introducción a Symfony2
Desymfony 2011 - Introducción a Symfony2
 
Curso Symfony - Anexos
Curso Symfony - AnexosCurso Symfony - Anexos
Curso Symfony - Anexos
 
Curso Symfony - Clase 5
Curso Symfony - Clase 5Curso Symfony - Clase 5
Curso Symfony - Clase 5
 
Curso Symfony - Clase 4
Curso Symfony - Clase 4Curso Symfony - Clase 4
Curso Symfony - Clase 4
 
Curso Symfony - Clase 3
Curso Symfony - Clase 3Curso Symfony - Clase 3
Curso Symfony - Clase 3
 

Recently uploaded

KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...JaquelineJuarez15
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...FacuMeza2
 
ejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofJuancarlosHuertasNio1
 

Recently uploaded (20)

KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
 
ejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sof
 

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

  • 1. deSymfony 30 junio - 1 julio 2017 Castellón SYMFONY 4, SYMFONY FLEX Y EL FUTURO DE SYMFONY Javier Eguiluz
  • 2. deSymfony ¡Muchas gracias a nuestros patrocinadores!
  • 3. Licencia de esta presentación creativecommons.org/licenses/by-nc-sa/3.0
  • 9. Hoja de ruta de Symfony Mayo 2017 Symfony 3.3 y Flex Noviembre 2017 Symfony 3.4 y 4.0 Junio 2017 deSymfony
  • 10. 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
  • 13. El framework más estándar • PSR-2(sintaxisdecódigo) • PSR-3(logs) • PSR-4(cargaautomáticadeclases) • PSR-6(cache) • PSR-7(mensajesHTTP)(*soporteparcial) • PSR-11(contenedoresdeservicios) • PSR-16(cachésimplificada)
  • 16.
  • 23. Un framework de bajo nivel • Conlosaños,Symfonysehaido convirtiendoenunframeworkdebajonivel. • EstamosmáscercadePHPquedeofrecer funcionalidadescompletas. • Noesalgomalo,siemprequeincluyas tambiénutilidadesdealtonivel.
  • 24. Ejemplos de integraciones • ElloggerintegralalibreríaMonolog. • ElmailerpermiteusarGmailfácilmente. • Losformulariosincluyentemaspara BootstrapyFoundation.
  • 27. Nuevos componentes Componente
 WebLink HTML 5 Link HTML 5 Preload Cloudflare HTTP/2
  • 31. ¿Qué es Webpack Encore? • Lanuevaherramientaoficialparagestionar assetsweb(CSS,JavaScript,fuentes, imágenes) • ReemplazaaAssetic.
  • 32. Webpack Encore por dentro • EstáprogramadoconJavaScript,noPHP. • InternamentehaceusodeWebpack. • Encorees"simplemente"unaformasencilla deconfigurarWebpack.
  • 33. Symfony + Webpack Encore Composer PHP Symfony
  • 34. Symfony + Webpack Encore yarn / npm Node.js Webpack Webpack Encore Composer PHP Symfony
  • 35. Webpack Encore en la práctica • Soportatodoloqueseusaenaplicaciones front-endmodernas(preprocessors,PostCSS, React,Babel,VUE,sourcemaps,versioning,CDNs,hot modulereplacements,etc.) • Tambiénsirveparaaplicacionesclásicaso sencillas(e.j.BootstrapyjQuery)
  • 36. Definiendo los assets con Webpack Encore package.json webpack.config.js assets/ app.scss app.js
  • 37. 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", } }
  • 38. Añadiendo dependencias de front-end $ yarn add @symfony/webpack-encore --dev $ yarn add bootstrap-sass --dev $ yarn add jquery --dev
  • 39. 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();
  • 40. 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
  • 41. 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
  • 42. Assets generados por Webpack Encore web/ build/ css/ app.css js/ app.js
  • 43. 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>
  • 44. Configuración para los assets de Symfony Demo Webpack Webpack Encore
  • 46. Añadiendo más integraciones • Idea:integraciónsimpledetecnologías(e.g. Webpack,Bootstrap) yservicios(AWS,GoogleCloud,Stripe, Mailgun,etc.) • SinreinventarAPIsointroducirnuevosconceptos • Siempreopcional • Todavíaestamospensandoencómohacerlo.
  • 49. La filosofía de Symfony SYMFONY
 1.x SYMFONY
 2.x SYMFONY
 3.x SYMFONY
 4.x
  • 50. La filosofía de Symfony SYMFONY
 1.x SYMFONY
 2.x SYMFONY
 3.x SYMFONY
 4.x Monolito mágico
  • 51. La filosofía de Symfony SYMFONY
 1.x SYMFONY
 2.x SYMFONY
 3.x SYMFONY
 4.x Monolito mágico Monolito + Componentes desacoplados
  • 52. 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
  • 53. 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
  • 55. Symfony 1, 2, 3 Symfony 4 • Aplicacionesweb
 
 
 
 
 
 
 • Aplicacionesweb • Microservicios • APIs • Aplicacionesdeconsola
 

  • 56. 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%
  • 57. La edición estándar de Symfony
  • 58. Cada tipo de aplicación tiene sus necesidades Microservicios Aplicaciones web API
  • 59. La edición estándar abarca todo Edición estándar de Symfony
  • 60. 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
  • 61. 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,389líneas de código
  • 62. Código PHP en vendor/ *se incluyen todos los tests 362,5645,274 archivos líneas de código
  • 63. Symfony 1, 2, 3 Symfony 4 Micro- aplicaciones pordefecto Monolitos siquieres Monolitos pordefecto Micro- aplicaciones siquieres
  • 64. ANTES: app/AppKernel.php use SymfonyComponentHttpKernelKernel; class AppKernel extends Kernel { public function registerBundles(); public function getCacheDir(); public function getLogDir(); public function registerContainerConfiguration(LoaderInterface $loader); }
  • 65. AHORA: src/Kernel.php use SymfonyBundleFrameworkBundleKernelMicroKernelTrait; use SymfonyComponentHttpKernelKernel 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); }
  • 66. Conceptos que desaparecen en Symfony 4 • SymfonyStandardEdition • SymfonyFull-StackFramework • DistribucionesSymfony • SensioDistributionBundle
  • 68. Se mantiene todo lo que ya conoces • Comandos • Controladores • Plantillas • Entidadesyrepositorios • Eventsubscribers • ExtensionesdeTwig
  • 70. 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
  • 71. 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
  • 72. Ventajas de la nueva estructura • Más"plana"yfácildenavegar. • Centralizacontenidosmanejadospor personasajenasalbackend(assets/,templates/) • DesacopladodeSymfony(assets/,src/, templates/,web/)
  • 78. El código se define bajo el namespace App // src/Controller/UserController.php namespace App; use SymfonyBundleFrameworkBundleControllerController; class UserController extends Controller { // ... }
  • 79. Los dos namespaces definidos por defecto { "...": "...", "autoload": { "psr-4": { "App": "src/" } }, "autoload-dev": { "psr-4": { "AppTests": "tests/" } } } composer.json
  • 80. Alternativas para seguir usando bundles • Convertirlosbundlesdetuaplicaciónen"third- partybundles"einstalarlosmedianteComposer • UsarlosnamespacesdePHPparasimularla separaciónmodulardecódigo. • Nohacernadayasumirquelosbundleshan desaparecido.
  • 83. Solo 1 controlador frontal (web/index.php) use AppKernel; use SymfonyComponentHttpFoundationRequest; 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);
  • 84. Solo 1 controlador frontal (web/index.php) use AppKernel; use SymfonyComponentHttpFoundationRequest; 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);
  • 87. Principales archivos de configuración app/ config/ config.yml routing.yml services.yml Symfony 3 Symfony 4 etc/ container.yaml routing.yaml packages/ *.yaml
  • 88. Principales archivos de configuración app/ config/ config.yml routing.yml services.yml Symfony 3 Symfony 4 etc/ container.yaml routing.yaml packages/ *.yaml
  • 89. Principales archivos de configuración app/ config/ config.yml routing.yml services.yml Symfony 3 Symfony 4 etc/ container.yaml routing.yaml packages/ *.yaml
  • 91. Activar y desactivar bundles app/ AppKernel.php Symfony 3 Symfony 4 etc/ bundles.php
  • 92. Los bundles se activan en etc/bundles.php <?php return [ 'SymfonyBundleFrameworkBundleFrameworkBundle' => ['all' => true], 'SymfonyBundleMonologBundleMonologBundle' => ['all' => true], 'DoctrineBundleDoctrineCacheBundleDoctrineCacheBundle' => ['all' => true], 'DoctrineBundleDoctrineBundleDoctrineBundle' => ['all' => true], 'SymfonyBundleWebProfilerBundleWebProfilerBundle' => ['dev' => true, 'test' => true], 'SymfonyBundleTwigBundleTwigBundle' => ['all' => true], ];
  • 93. Los bundles se activan en etc/bundles.php <?php return [ 'SymfonyBundleFrameworkBundleFrameworkBundle' => ['all' => true], 'SymfonyBundleMonologBundleMonologBundle' => ['all' => true], 'DoctrineBundleDoctrineCacheBundleDoctrineCacheBundle' => ['all' => true], 'DoctrineBundleDoctrineBundleDoctrineBundle' => ['all' => true], 'SymfonyBundleWebProfilerBundleWebProfilerBundle' => ['dev' => true, 'test' => true], 'SymfonyBundleTwigBundleTwigBundle' => ['all' => true], ]; TRUCO Si usas Symfony Flex, los bundles se activan y desactivan automáticamente.
  • 94. 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
  • 95. 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
  • 96. Cómo carga Symfony 4 la configuración namespace App; use SymfonyBundleFrameworkBundleKernelMicroKernelTrait; use SymfonyComponentConfigLoaderLoaderInterface; use SymfonyComponentDependencyInjectionContainerBuilder; use SymfonyComponentHttpKernelKernel 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'); } }
  • 97. 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
  • 100. 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://root@127.0.0.1:3306/symfony" MAILER_URL = "smtp://localhost:25?encryption=&auth_mode="
  • 101. 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://root@127.0.0.1:3306/symfony" MAILER_URL = "smtp://localhost:25?encryption=&auth_mode=" CUIDADO Todas las variables de entorno son de tipo string.
  • 102. 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://root@127.0.0.1:3306/symfony"
  • 103. 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
  • 104. 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
  • 105. 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
  • 109. Symfony Flex • NoesunaversiónespecialdeSymfony. • ReemplazaalinstaladordeSymfony. • Noseráestablehastaellanzamientode Symfony4,peroyasepuedeusar. • SuusoesOPCIONAL(inclusoenSymfony4)
  • 110. Compatibilidad de Symfony Flex SYMFONY
 3.2 SYMFONY
 3.3 SYMFONY
 3.4 SYMFONY
 4.0 SYMFONY
 4.1 NO funciona SI funciona Se usa por defecto (pero sigue siendo opcional)
  • 111. Instalando un paquete con Composer $ composer require symfony/console
  • 112. Instalando un paquete con Composer $ composer require symfony/console github.compackagist.org
  • 113. Instalando un paquete con Composer $ composer require symfony/console github.compackagist.org
  • 114. Instalando un paquete con Composer $ composer require symfony/console github.compackagist.org
  • 115. Instalando un paquete con Composer $ composer require symfony/console github.compackagist.org
  • 116. Instalando Flex en un proyecto existente $ composer require symfony/flex
  • 117. Instalando un paquete con Composer + Flex $ composer require symfony/console
  • 118. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh
  • 119. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh
  • 120. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh receta
  • 121. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh receta
  • 122. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh receta
  • 123. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh receta
  • 124. Instalando un paquete con Composer + Flex $ composer require symfony/console github.compackagist.orgsymfony.sh receta
  • 125. 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
  • 126. 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
  • 127. Symfony Flex en la práctica
  • 128. Ejemplo #1 Crear un nuevo proyecto Symfony
  • 129. 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
  • 130. 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
  • 131. Código PHP en vendor/ *se incluyen todos los tests 106,3551,546 archivos líneas de código
  • 132. Symfony 3.2 vs Symfony 3.3 + Flex 106,3551,546 archivos líneas de código 362,5645,274 -70% -70%
  • 133. 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
  • 134. 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
  • 135. 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" }, }
  • 136. SIN Symfony Flex CON Symfony Flex
  • 137. SIN Symfony Flex CON Symfony Flex
  • 138. Ejemplo #2 Instalar un bundle de terceros
  • 140. Instalar SncRedisBundle SIN Flex (1/4) $ composer require snc/redis-bundle
  • 141. Instalar SncRedisBundle SIN Flex (2/4) // app/AppKernel.php use SymfonyComponentHttpKernelKernel; class AppKernel extends Kernel { public function registerBundles() { $bundles = [ // ... new SncRedisBundleSncRedisBundle(), ]; // ... return $bundles; } // ... }
  • 142. Instalar SncRedisBundle SIN Flex (3/4) # app/config/parameters.yml parameters: REDIS_URL: "redis://localhost"
  • 143. Instalar SncRedisBundle SIN Flex (4/4) # app/config/config.yml snc_redis: clients: default: type: predis alias: default dsn: "%env(REDIS_URL)%"
  • 144. Instalar SncRedisBundle CON Flex $ composer require snc/redis-bundle
  • 145. Instalar SncRedisBundle CON Flex $ composer require snc/redis-bundle ¡YAESTÁ!
  • 146. Symfony Flex automatiza el proceso • Flexactivaelbundleenetc/bundles.php • Flexdefinelavariabledeentorno REDIS_URLenweb/.env(yweb/env.dist). • Flexcreaelarchivoetc/packages/ snc_redis.yamlconlaconfiguracióninicial
  • 147. Symfony Flex automatiza el proceso • Cuandodesinstalaselbundle,Symfony Flexdeshacetodosloscambiosanteriores.
  • 150. Recetas de Symfony Flex • SonlasinstruccionesqueutilizaFlexpara automatizarlastareas. • Estánformadasporunarchivo manifest.jsony,opcionalmente,otros archivosydirectorios.
  • 151. Ejemplo de receta de SncRedisBundle (1/2) { "bundles": { "SncRedisBundleSncRedisBundle": ["all"] }, "copy-from-recipe": { "etc/": "%ETC_DIR%/" }, "env": { "#": "passwords that contain special characters (@, %, :, +) must be urlencoded", "REDIS_URL": "redis://localhost" } }
  • 152. 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)%"
  • 153. Repositorios de recetas • github.com/symfony/recipes
 Elrepositoriooficial.PordefectoSymfonyFlexsolobuscaen esterepositorio. • github.com/symfony/recipes-contrib
 Elrepositoriodelacomunidad.ParausarloconFlex,ejecuta: composerconfigextra.symfony.allow-contribtrue • Porelmomentonosepuedencrearrecetasparapaquetes privadosdetupropiaempresa(sepodráenelfuturo).
  • 155. No hace falta el nombre completo $ composer require logger
  • 156. No hace falta el nombre completo $ composer require logger ¿Es un "alias"?1 MonologBundle log logger logging logs monolog =
  • 157. Se han definido decenas de alias $ composer require debug $ composer require doctrine $ composer require logger $ composer require profiler $ composer require server $ composer require twig
  • 158. No hace falta el nombre completo $ composer require logger ¿Es un "alias"?1 ¿Existe el paquete symfony/xxxx?2
  • 159. No hace falta el nombre completo $ composer require logger ¿Es un "alias"?1 ¿Existe el paquete symfony/xxxx?2 ¿Existe el paquete xxxx?3
  • 160. 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
  • 163. Estructura requerida por Symfony Flex etc/ bundles.php container.yaml routing.yaml packages/ src/ Kernel.php .../ .env
  • 164. El proceso de actualización • Porelmomento,manual. • Podríapublicarseunaherramienta automática.
  • 165. Actualiza tu infraestructura PHP7.1 requerido por Symfony Flex y Symfony 4
  • 166. Paso 1: Crear una aplicación Flex nueva $ composer create symfony/skeleton mi-proyecto-flex
  • 167. 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" },
  • 168. Paso 3: instala las dependencias $ cd tu-proyecto/ $ composer install
  • 169. 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
  • 170. Paso 4: Retoca la configuración si hace falta Compruebaloscontenidosdeconfig.yml, config_dev.ymlyconfig_prod.ymlycopiala configuraciónquehagafaltaenlosnuevos archivosetc/packages/*.yaml
  • 171. Paso 4: Retoca la configuración si hace falta Compruebaloscontenidosdeconfig.yml, config_dev.ymlyconfig_prod.ymlycopiala configuraciónquehagafaltaenlosnuevos archivosetc/packages/*.yaml CUIDADO Esta es la parte más aburrida y donde más fácilmente se pueden cometer errores.
  • 172. Paso 5: Mueve tu código a src/ • Mejorcaso:todotucódigoestáenAppBundle
 Copiaelcódigodirectamenteensrc/ycambiael namespacedeAppBundleaAppconPHPStorm • Peorcaso:tienesmuchosbundles
 Puedesmantenerlos(cambiandoelnamespaceaApp) perodeberíasirplanteándoteeliminarlos
  • 173. Paso 6: Mueve tus plantillas • Mejorcaso:plantillasenapp/Resources/views/
 Cópialasdirectamenteentemplates/ • Peorcaso:plantillasenotrosdirectorios
 PuedesmantenerlosactualizandolaconfiguracióndeTwig # etc/packages/twig.yaml twig: paths: ['%kernel.project_dir%/templates'] # ...
  • 174. Silex
  • 176. ¿Por qué usas Silex en vez de Symfony? • Másrendimiento • Menoscódigo • Menosdependencias • Menosconfiguración
  • 177. 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
  • 178. 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
  • 179. Mi consejo • NouséisSilexparanuevosproyectos. • ConsideradvuestrosproyectosSilex existentescomo"legacy". • Preparadunplandeactualizacióna SymfonyFlex.