SlideShare ist ein Scribd-Unternehmen logo
1 von 188
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Ähnlich wie 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
 

Ähnlich wie 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
 

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

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

Kürzlich hochgeladen

Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
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
 

Kürzlich hochgeladen (13)

Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
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
 

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.