Symfony2, Jornadas Symfony
-
Upload
javier-eguiluz -
Category
Technology
-
view
7.025 -
download
2
description
Transcript of Symfony2, Jornadas Symfony
organizan patrocinan
colaboran
Jornadas Symfony 5 y 6 de julio 2010Universitat Jaume I, Castellón
http://decharlas.uji.es/symfony
Jornadas Symfony http://decharlas.uji.es/symfony
NOTAEsta presentación es la versión simplificada de la que se utilizó en las primeras Jornadas Symfony.
La presentación original está llena de efectos gráficos y animaciones imposibles de utilizar en slideshare.net
Puedes ver la grabación en vídeo de la presentación original en http://bit.ly/symfony2
Jornadas Symfony http://decharlas.uji.es/symfony
NOTEThis is the simplified version of the presentation used at the first Spanish Symfony Conference.
The original presentation includes lots of cool effects and animations that cannot be exported to slideshare.net
You can watch the video recording of the original presentation at http://bit.ly/symfony2
Symfony 2Javier Eguíluz, symfony.es
Jornadas Symfony 5 y 6 de julio 2010Universitat Jaume I, Castellón
http://decharlas.uji.es/symfony
Jornadas Symfony http://decharlas.uji.es/symfony
sesión patrocinada por
www.ideatea.com
Jornadas Symfony http://decharlas.uji.es/symfony
¿Qué es Symfony 2?
Jornadas Symfony http://decharlas.uji.es/symfony
ymfonys
Jornadas Symfony http://decharlas.uji.es/symfony
2S ymfony
Jornadas Symfony http://decharlas.uji.es/symfony
¿En qué se diferencian sf 1 y sf2?
Jornadas Symfony http://decharlas.uji.es/symfony
todoen
Jornadas Symfony http://decharlas.uji.es/symfony
todoen casi
Jornadas Symfony http://decharlas.uji.es/symfony
La evolución de Symfony
Jornadas Symfony http://decharlas.uji.es/symfony
symfony
2007sf 1.0
Jornadas Symfony http://decharlas.uji.es/symfony
symfony
sfRequest sfRouting sfLogger sfI18N sfUser
sfResponse sfYAML sfDatabase sfForm sfStorage
sfCache sfWidget sfValidator sfEventDispatcher
sfOutputEscaper
sfCoreAutoload
2008sf 1.2
Jornadas Symfony http://decharlas.uji.es/symfony
symfony
2009sf 1.4
Jornadas Symfony http://decharlas.uji.es/symfony
¿Por qué reescribirlo todo de nuevo?
Jornadas Symfony http://decharlas.uji.es/symfony
Muchos archivosConfiguraciónDifícil de aprenderFormulariosL E N T O
Problemas
: )
Jornadas Symfony http://decharlas.uji.es/symfony
Nuestro primer proyecto Symfony2
Jornadas Symfony http://decharlas.uji.es/symfony
5.3.2 subversion
Jornadas Symfony http://decharlas.uji.es/symfony
> git clone
http://github.com/symfony/
symfony-sandbox.git
Jornadas Symfony http://decharlas.uji.es/symfony
2.x
1.x
symfony 1.4sandbox
8.5 MB
3.919 archivos
3 MB
2.244 archivosSymfony2
sandbox
Jornadas Symfony http://decharlas.uji.es/symfony
Demo
Jornadas Symfony http://decharlas.uji.es/symfony
> php hello/console -s
> init:app frontend
frontend/
web/
--yaml
> init:bundle Application/
FrontendBundle
Jornadas Symfony http://decharlas.uji.es/symfony
El código fuente
Jornadas Symfony http://decharlas.uji.es/symfony
1.x 2.x<?php
class Filesystem{ public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; }
return @mkdir($path, $mode, true); }
public function touch($files) { if (!is_array($files)) { $files = array($files); }
foreach ($files as $file) { touch($file); } }
<?php
class sfFilesystem{
public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; }
return @mkdir($path, $mode, true); }
public function touch($files) { if (!is_array($files)) { $files = array($files); }
foreach ($files as $file) { touch($file); } }
Jornadas Symfony http://decharlas.uji.es/symfony
1.x 2.x<?php
class Filesystem{ public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; }
return @mkdir($path, $mode, true); }
public function touch($files) { if (!is_array($files)) { $files = array($files); }
foreach ($files as $file) { touch($file); } }
<?php
class sfFilesystem{
public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; }
return @mkdir($path, $mode, true); }
public function touch($files) { if (!is_array($files)) { $files = array($files); }
foreach ($files as $file) { touch($file); } }
Zend / PEAR
Jornadas Symfony http://decharlas.uji.es/symfony
1.x 2.x<?php
class Filesystem{ public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; }
return @mkdir($path, $mode, true); }
public function touch($files) { if (!is_array($files)) { $files = array($files); }
foreach ($files as $file) { touch($file); } }
<?php
class sfFilesystem{
public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; }
return @mkdir($path, $mode, true); }
public function touch($files) { if (!is_array($files)) { $files = array($files); }
foreach ($files as $file) { touch($file); } }
2 espacios 4 espacios
Jornadas Symfony http://decharlas.uji.es/symfony
1.x 2.x<?php
class Filesystem{ public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; }
return @mkdir($path, $mode, true); }
public function touch($files) { if (!is_array($files)) { $files = array($files); }
foreach ($files as $file) { touch($file); } }
<?php
class sfFilesystem{
public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; }
return @mkdir($path, $mode, true); }
public function touch($files) { if (!is_array($files)) { $files = array($files); }
foreach ($files as $file) { touch($file); } }
if ( ){ ...}
if ( ) { ...}
Jornadas Symfony http://decharlas.uji.es/symfony
<?php
namespace Symfony\Framework\FoundationBundle;
use Symfony\Components\...\ContainerInterface;
use Symfony\Components\HttpKernel\Request;
use Symfony\Components\HttpKernel\Response;
use Symfony\Components\...\HttpKernelInterface;
class Controller
{
protected $container;
protected $request;
...
Jornadas Symfony http://decharlas.uji.es/symfony
namespaces
Jornadas Symfony http://decharlas.uji.es/symfony
class Migration
{
...
}
class Migration
{
...
}
Jornadas Symfony http://decharlas.uji.es/symfony
class sfMigration
{
...
}
class Doctrine_Migration
{
...
}
Jornadas Symfony http://decharlas.uji.es/symfony
namespace Symfony;
class Migration
{
...
}
namespace Doctrine;
class Migration
{
...
}
Jornadas Symfony http://decharlas.uji.es/symfony
namespace Symfony;
class Migration
{
...
}
namespace Doctrine;
class Migration
{
...
}
$migracion = new \Symfony\Migration();
$migracion = new \Doctrine\Migration();
Jornadas Symfony http://decharlas.uji.es/symfony
Symfony\ComponentsSymfony\Framework
Symfony\Foundation
Jornadas Symfony http://decharlas.uji.es/symfony
Symfony\ComponentsBrowserKit Console CssSelector
DependencyInjectionDependencyInjection DomCrawler
EventDispatcher File Finder
Form HttpKernel I18N
OutputEscaper Process Routing
Templating Validator Yaml
Jornadas Symfony http://decharlas.uji.es/symfony
xxxxxx
xxxxxxxxxxxxx
completo
xxxxxx
Jornadas Symfony http://decharlas.uji.es/symfony
Estructura del proyecto
Jornadas Symfony http://decharlas.uji.es/symfony
2.xmi_proyecto/ apps/ frontend/ cache/ config/ data/ lib/ log/ plugins/ test/ web/
mi_proyecto/ frontend/ src/ web/
1.x
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/ frontend/ src/ web/
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/frontend/ frontendKernel.php
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/frontend/ frontendKernel.php cache/ logs/ config/
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/frontend/ frontendKernel.php cache/ logs/ config/ routing.yml config.yml config_dev.yml config_prod.yml
Jornadas Symfony http://decharlas.uji.es/symfony
2.x1.x
7 archivos
124 líneas
3 archivos
35 líneas
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/ frontend/ src/ web/
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/src/ autoload.php
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/src/ autoload.php Application/ Bundle/ vendor/
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/src/ autoload.php Application/ Bundle/ vendor/ symfony/ doctrine/ zend/
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/src/ autoload.php Application/ FrontendBundle/ Bundle/ vendor/ symfony/ doctrine/ zend/
Jornadas Symfony http://decharlas.uji.es/symfony
2.x
Proyecto
Aplicación
Módulo
1.x
Proyecto
Aplicación
Bundle
Jornadas Symfony http://decharlas.uji.es/symfony
ProyectoAplicación 1
Aplicación 2
Módulo 1
Módulo 2
Módulo 3
Módulo 4 Módulo 5
Plugins
Plugin 2
Plugin 1
Plugin 3
Jornadas Symfony http://decharlas.uji.es/symfony
ProyectoAplicación 1
Aplicación 2
Módulo 1 Módulo 2 Módulo 3
Módulo 4 Módulo 5
Plugin 2
Plugin 1
Plugin 3
Jornadas Symfony http://decharlas.uji.es/symfony
ProyectoAplicación 1
Aplicación 2
Bundle 1 Bundle 2 Bundle 3
Bundle 4 Bundle 5
Bundle 7
Bundle 6
Bundle 8
Jornadas Symfony http://decharlas.uji.es/symfony
Bundles(paquetes)
Jornadas Symfony http://decharlas.uji.es/symfony
« Un bundle es un conjunto de archivos que implementan una
funcionalidad »
Jornadas Symfony http://decharlas.uji.es/symfony
1.x
oferta, categoría, empresa
Proyecto
jobeet
Aplicacionesfrontend, backend
Módulos
Jornadas Symfony http://decharlas.uji.es/symfony
2.x
frontend, backend
Proyecto
jobeet
Aplicacionesfrontend, backend
Bundle
Jornadas Symfony http://decharlas.uji.es/symfony
2.x
oferta, categoría, empresa
Proyecto
jobeet
Aplicacionesfrontend, backend
Bundle
Jornadas Symfony http://decharlas.uji.es/symfony
2.x
frontend, backend, oferta, categoría, empresa
Proyecto
jobeet
Aplicacionesfrontend, backend
Bundle
Jornadas Symfony http://decharlas.uji.es/symfony
2.x
Aplicación
Módulo
Plugin
Librerías
1.x
Bundle
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/src/ autoload.php Application/ FrontendBundle/ Bundle/ vendor/
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/src/Application/ FrontendBundle/ Controller/ Resources/
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/src/Application/ FrontendBundle/ Controller/ DefaultController.php Resources/
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/src/Application/ FrontendBundle/ Controller/ DefaultController.php Resources/ config/ views/
Jornadas Symfony http://decharlas.uji.es/symfony
mi_proyecto/src/Application/ FrontendBundle/ Controller/ DefaultController.php Resources/ config/ routing.yml views/ index.php
Jornadas Symfony http://decharlas.uji.es/symfony
twig
Jornadas Symfony http://decharlas.uji.es/symfony
PropelBundle/ Command/ DependencyInjection/ Logger/ Resources/ Tests/
Jornadas Symfony http://decharlas.uji.es/symfony
TwigBundle/ DependencyInjection/ Extension/ Loader/ Renderer/ Resources/ Tests/ TokenParsers/
Jornadas Symfony http://decharlas.uji.es/symfony
Jornadas Symfony http://decharlas.uji.es/symfony
modular
xxxxxxxxxxxxx
completo
xxxxxx
Jornadas Symfony http://decharlas.uji.es/symfony
Inyección de Dependencias
Jornadas Symfony http://decharlas.uji.es/symfony
Inyección de Dependencias DIInversion of Control IoC
Jornadas Symfony http://decharlas.uji.es/symfony
Inyección de Dependencias DI
Inversion of Control
Jornadas Symfony http://decharlas.uji.es/symfony
sfConfigsfProjectConfigurationsfAppConfiguration
sfContextconfig handlers...
1.x 2.x
DI
Jornadas Symfony http://decharlas.uji.es/symfony
Problema
¿Cómo configuro un objeto mailer para enviar emails desde mis aplicaciones?
Jornadas Symfony http://decharlas.uji.es/symfony
public function emailAction(){ $mailer = $this->getMailer();
$mensaje = \Swift_Message::newInstance()
->setSubject('Asunto')
->setFrom('[email protected]')
->setTo('[email protected]')
->setBody('Cuerpo');
$mailer->send($mensaje);
...}
Jornadas Symfony http://decharlas.uji.es/symfony
class Mailer
{
function __construct() {
$this->setUsername('xxxxxxxx')
$this->setPassword('xxxxxxxx');
}
}
$mailer = $this->getMailer();
Jornadas Symfony http://decharlas.uji.es/symfony
class Mailer
{
function __construct() {
$this->setUsername(MAILER_USERNAME)
$this->setPassword(MAILER_PASSWORD);
}
}
define('MAILER_USERNAME', 'xxxxxxxx');
define('MAILER_PASSWORD', 'xxxxxxxx');
$mailer = $this->getMailer();
Jornadas Symfony http://decharlas.uji.es/symfony
class Mailer
{
function __construct($user, $pass) {
$this->setUsername($user)
$this->setPassword($pass);
}
}
$mailer = $this->getMailer('xxxx', 'xxxx');
Jornadas Symfony http://decharlas.uji.es/symfony
class Mailer
{
function __construct($transport) {
$this->transport = $transport;
}
}
$transport = new SMTP_Gmail($user, $pass);
$mailer = $this->getMailer($transport);
Jornadas Symfony http://decharlas.uji.es/symfony
DIC
Jornadas Symfony http://decharlas.uji.es/symfony
DIC
ependencynjectionontainer
Jornadas Symfony http://decharlas.uji.es/symfony
DIC configuración flexible=
Jornadas Symfony http://decharlas.uji.es/symfony
public function emailAction(){ $mailer = $this->getMailer();
$mensaje = \Swift_Message::newInstance() ->setSubject('Asunto') ->...
frontend/config/config.ymlswift.mailer:
transport: gmail
username: xxxxxxxx
password: xxxxxxxx
src/FrontendBundle/Controller/DefaultController.php
Jornadas Symfony http://decharlas.uji.es/symfony
DIC! Objetos globales" Modelo" Tus clases
Jornadas Symfony http://decharlas.uji.es/symfony
El modelo
Jornadas Symfony http://decharlas.uji.es/symfony
Jornadas Symfony http://decharlas.uji.es/symfony
Jornadas Symfony http://decharlas.uji.es/symfony
DBAL
PDO
ORM
Jornadas Symfony http://decharlas.uji.es/symfony
ORM
ODM
Jornadas Symfony http://decharlas.uji.es/symfony
Object Document Mapper
Jornadas Symfony http://decharlas.uji.es/symfony
NoSQL
Jornadas Symfony http://decharlas.uji.es/symfony
NoSQL
Jornadas Symfony http://decharlas.uji.es/symfony
Jornadas Symfony http://decharlas.uji.es/symfony
doctrine:ensure-production-settings
doctrine:cache:clear-metadata
doctrine:cache:clear-query
doctrine:clear-result
doctrine:data:load
doctrine:database:create
doctrine:database:drop
doctrine:generate:entities
doctrine:generate:entity
doctrine:generate:proxies
doctrine:generate:repositories
Jornadas Symfony http://decharlas.uji.es/symfony
doctrine:mapping:convert
doctrine:mapping:convert-d1-schema
doctrine:mapping:import
doctrine:query:dql
doctrine:query:sql
doctrine:schema:create
doctrine:schema:drop
doctrine:schema:update
Jornadas Symfony http://decharlas.uji.es/symfony
class DefaultController extends Controller
{
public function indexAction()
{
$conexion = $this->container->getService(
'database_connection'
);
$ofertas = $conexion->fetchAll(
'SELECT * FROM ofertas'
);
...
}
}
Jornadas Symfony http://decharlas.uji.es/symfony
class DefaultController extends Controller
{
public function modificarAction()
{
$orm = $this->getEntityManager();
$oferta = new Oferta();
$oferta->setTitulo('Programador Senior');
$orm->persist($oferta);
$orm->flush();
...
}
}
Jornadas Symfony http://decharlas.uji.es/symfony
class DefaultController extends Controller
{
public function modificarAction()
{
$odm = $this->getDocumentManager();
$oferta = new Oferta();
$oferta->setTitulo('Programador Senior');
$odm->persist($oferta);
$odm->flush();
...
}
}
Jornadas Symfony http://decharlas.uji.es/symfony
La Vista
Jornadas Symfony http://decharlas.uji.es/symfony
1.x 2.x
slotlayoutpartial
plantillacomponent
component slot
plantillaslot
plantillaslot
plantillaplantilla
acción+
plantilla
acción+
Jornadas Symfony http://decharlas.uji.es/symfony
1.x 2.x
slotlayoutpartial
plantillacomponent
component slot
plantilla
slotplantilla slot+plantilla
plantilla acción+plantilla acción+
Jornadas Symfony http://decharlas.uji.es/symfony
modular
fácilxxxxxxxx
completo
xxxxxx
Jornadas Symfony http://decharlas.uji.es/symfony
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8" />
</head>
<body>
<?php echo $sf_content ?>
</body>
</html>
1.x
Jornadas Symfony http://decharlas.uji.es/symfony
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8" />
</head>
<body>
<?php $view->slots->output('_content') ?>
</body>
</html>
2.x
Jornadas Symfony http://decharlas.uji.es/symfony
<?php $view->extend(
'FrontendBundle:Default:layout'
); ?>
<h1><?php echo $oferta['titulo'] ?></h1>
<p><?php echo $oferta['descripcion'] ?></p>
...
Jornadas Symfony http://decharlas.uji.es/symfony
$view->extend('FrontendBundle:Default:layout');
src/ Application/ FrontendBundle/ Resources/ views/ Default/ layout.php
Jornadas Symfony http://decharlas.uji.es/symfony
$view->extend('FrontendBundle::layout');
src/ Application/ FrontendBundle/ Resources/ views/ layout.php
Jornadas Symfony http://decharlas.uji.es/symfony
$view->extend('PlantillasBundle::layout');
src/ Bundle/ PlantillasBundle/ Resources/ views/ layout.php
Jornadas Symfony http://decharlas.uji.es/symfony
$view->extend(
'PlantillasBundle::layout_pagina'
);
$view->extend(
'PlantillasBundle::layout_pagina'
);
$view->extend(
'PlantillasBundle::layout_pagina'
);
Jornadas Symfony http://decharlas.uji.es/symfony
$view->extend(
'PlantillasBundle::layout_pagina'
);
$view->extend(
'PlantillasBundle::layout_seccion'
);
$view->extend(
'PlantillasBundle::layout_seccion'
);
Jornadas Symfony http://decharlas.uji.es/symfony
$view->extend(
'PlantillasBundle::layout_pagina'
);
$view->extend(
'PlantillasBundle::layout'
);
$view->extend(
'PlantillasBundle::layout'
);
Jornadas Symfony http://decharlas.uji.es/symfony
echo $view->render(
'SitioBundle::buscador'
)
...
echo $view->render(
'NoticiasBundle:Default:ultimaHora',
array('noticias' => $noticias)
)
Jornadas Symfony http://decharlas.uji.es/symfony
echo $view->actions->output(
'BolsaBundle:Cotizaciones:indices',
array('indice' => 'IBEX35')
)
...
echo $view->actions->output(
'ContenidosBundle:Noticias:ultimaHora'
)
Jornadas Symfony http://decharlas.uji.es/symfony
$view->extend(...)
$view->render(...)
$view->actions->output(...)
Jornadas Symfony http://decharlas.uji.es/symfony
Helpers
Jornadas Symfony http://decharlas.uji.es/symfony
Los helpers de Symfony2 son objetos
Jornadas Symfony http://decharlas.uji.es/symfony
<a href="<?php
echo $view->router->generate('portada')
?>">
Portada
</a>
Jornadas Symfony http://decharlas.uji.es/symfony
2.x
1.x
<?php include_stylesheets() ?>
<?php use_stylesheet('main.css') ?>
<?php echo $view->stylesheets ?>
<?php $view->stylesheets->add('main.css') ?>
Jornadas Symfony http://decharlas.uji.es/symfony
«We're trading line length for lower [code] complexity»
David HeinemeierRailsConf 2010
Jornadas Symfony http://decharlas.uji.es/symfony
Plantillas avanzadas
Jornadas Symfony http://decharlas.uji.es/symfony
twig
Jornadas Symfony http://decharlas.uji.es/symfony
twig
PHP
<h1><?php echo $oferta['titulo'] ?></h1>
<h1>{{ oferta.titulo }}</h1>
Jornadas Symfony http://decharlas.uji.es/symfony
twig
PHP<a href="<?php
echo $view->router->generate('portada')
?>">
Volver a la portada
</a>
<a href="{% route 'portada' %}">
Volver a la portada
</a>
Jornadas Symfony http://decharlas.uji.es/symfony
twig
PHP<?php foreach ($ofertas as $id => $oferta): ?>
<h2><?php echo $oferta['titulo'] ?></h2>
<p><?php echo $oferta['descripcion'] ?></p>
...
<?php endforeach ?>
{% for oferta in ofertas %}
<h2>{{ oferta.titulo }}</h2>
<p>{{ oferta.descripcion }}</p>
...
{% endfor %}
Jornadas Symfony http://decharlas.uji.es/symfony
! Código conciso! Diseñadores! Ultra-rápido
twig
Jornadas Symfony http://decharlas.uji.es/symfony
El controlador
Jornadas Symfony http://decharlas.uji.es/symfony
1.x 2.xrouting.yml routing.ymlbundle bundle
bundle bundle
Jornadas Symfony http://decharlas.uji.es/symfony
2.x
1.x
homepage:
pattern: /
defaults: { _bundle: FoundationBundle ,
_controller: Default, _action: index }
apps/frontend/config/config.yml
frontend/config/config.yml
homepage:
url: /
param: { module: default, action: index }
Jornadas Symfony http://decharlas.uji.es/symfony
homepage:
pattern: /
defaults: { _controller:
FoundationBundle:Default:index }
homepage:
pattern: /
defaults: { _bundle: FoundationBundle ,
_controller: Default, _action: index }
Jornadas Symfony http://decharlas.uji.es/symfony
2.xfrontend/config/routing.yml
homepage:
pattern: /
defaults: { _controller:
FoundationBundle:Default:index }
frontend:
resource: FrontendBundle/Resources/
config/routing.yml
Jornadas Symfony http://decharlas.uji.es/symfony
public function ofertaAction($id)
{
...
}
oferta:
pattern: /ofertas/:id
...
Jornadas Symfony http://decharlas.uji.es/symfony
public function ofertaAction($seccion, $categoria)
{
...
}
oferta:
pattern: /ofertas/:seccion/:categoria
...
Jornadas Symfony http://decharlas.uji.es/symfony
2.x
1.x
public function indexAction()
{
return $this->render(
'FrontendBundle:Default:index',
array('ofertas' => $ofertas)
);
}
public function indexAction()
{
$this->ofertas = $ofertas;
}
*Se supone que la plantilla es indexSuccess.php
Jornadas Symfony http://decharlas.uji.es/symfony
Formularios
Jornadas Symfony http://decharlas.uji.es/symfony
Form ModelosfForm Controlador Modelo
2.x
1.x
Jornadas Symfony http://decharlas.uji.es/symfony
sfForm Controlador Modelo
Form Modelo
2.x
1.x
Jornadas Symfony http://decharlas.uji.es/symfony
$form = new Form('cliente', $cliente);
$form->add(new TextField('nombre'));
$form->add(new TextField('apellidos'));
$form->add(new TextareaField('direccion'));
Jornadas Symfony http://decharlas.uji.es/symfony
TextField
TextareaField
CheckboxField
ChoiceField
PasswordField
HiddenField
Jornadas Symfony http://decharlas.uji.es/symfony
$form->add(new RepeatedField(
new PasswordField('contrasena'))
));
Contraseña
Repite la contraseña
Jornadas Symfony http://decharlas.uji.es/symfony
$form->add(new CollectionField(
new TextField('telefonos'))
));
Teléfono 1
Teléfono 2
Teléfono 3
Jornadas Symfony http://decharlas.uji.es/symfony
$direccion = new FieldGroup('direccion');
$direccion->add(new TextField('calle'));
$direccion->add(new TextField('numero'));
$direccion->add(new TextField('piso'));
$direccion->add(new TextField('cp'));
$form->add($direccion);
Calle
Número Piso CP
Dirección
Jornadas Symfony http://decharlas.uji.es/symfony
TextField RepeatedField
TextareaField CollectionField
CheckboxField FieldGroup
ChoiceField
PasswordField
HiddenField
Jornadas Symfony http://decharlas.uji.es/symfony
TextField RepeatedField MoneyField
TextareaField CollectionField DateField
CheckboxField FieldGroup BirthdayField
ChoiceField NumberField TimeField
PasswordField IntegerField DateTimeField
HiddenField PercentField TimezoneField
i18n
i18n
i18n
i18n
i18n
i18n
i18n
i18n
i18n
Jornadas Symfony http://decharlas.uji.es/symfony
Validación
Jornadas Symfony http://decharlas.uji.es/symfony
Form
Modelo
Validador
1.x 2.x
sfForm
sfValidator
Controlador
Modelo
Jornadas Symfony http://decharlas.uji.es/symfony
1.x 2.x
Form
Modelo
Validador
FormValidadorsfForm
sfValidator
Controlador
Modelo
Jornadas Symfony http://decharlas.uji.es/symfony
Application\FrontendBundle\Model\Cliente:
properties:
nombre:
- MinLength: 3
fecha_nacimiento:
- Date: ~
codigo_postal:
- MaxLength: 5
Jornadas Symfony http://decharlas.uji.es/symfony
class Cliente
{
public $nombre;
public $fecha_nacimiento;
public $codigo_postal;
}
Jornadas Symfony http://decharlas.uji.es/symfony
class Cliente
{
/** @Validation({ @MinLength(3) }) */
public $nombre;
/** @Validation({ @Date }) */
public $fecha_nacimiento;
/** @Validation({ @MaxLength(5) }) */
public $codigo_postal;
}
Jornadas Symfony http://decharlas.uji.es/symfony
JSR 303 Bean Validation
Validating data is a common task that occurs throughout an application, from the presentation layer to the persistence layer. Often the same validation logic is implemented in each layer, proving to be time consuming and error-prone. To avoid duplication of these validations in each layer, developers often bundle validation logic directly into the domain model, cluttering domain classes with validation code that is, in fact, metadata about the class itself.
This JSR defines a metadata model and API for JavaBean validation. The default metadata source is annotations, with the ability to override and extend the meta-data through the use of XML validation descriptors.
The validation API developed by this JSR is not intended for use in any one tier or programming model. It is specifically not tied to either the web tier or the persistence tier, and is available for both server-side application programming, as well as rich client Swing application developers. This API is seen as a general extension to the Java-Beans object model, and as such is expected to be used as a core component
Jornadas Symfony http://decharlas.uji.es/symfony
$validador = $this->container->getService(
'validator'
);
$form = new Form(
'cliente',
$cliente,
$validador
);
Jornadas Symfony http://decharlas.uji.es/symfony
Pruebas unitarias y funcionales
Jornadas Symfony http://decharlas.uji.es/symfony
PHPUnit 3.5
Jornadas Symfony http://decharlas.uji.es/symfony
src/ Application/ FrontendBundle/ Model/ Article.php Tests/ Model/ ArticleTest.php
Jornadas Symfony http://decharlas.uji.es/symfony
> phpunit -c frontend/
> phpunit -c frontend/ src/Application/
FrontendBundle/
Jornadas Symfony http://decharlas.uji.es/symfony
> phpunit -c frontend/
Jornadas Symfony http://decharlas.uji.es/symfony
> phpunit -c frontend/
Jornadas Symfony http://decharlas.uji.es/symfony
Estándares
Jornadas Symfony http://decharlas.uji.es/symfony
1.x 2.x
sfCachesfLogger
sfValidatorautoload
lime
Zend_CacheZend_LoggerJava JSR 303PHP 5.3 autoloadPHPUnit
Jornadas Symfony http://decharlas.uji.es/symfony
modular
fácilestándar
completo
xxxxxx
Jornadas Symfony http://decharlas.uji.es/symfony
Rendimiento
Jornadas Symfony http://decharlas.uji.es/symfony
100veces más rápido
que symfony 1
Jornadas Symfony http://decharlas.uji.es/symfony
100veces más rápido
que symfony 1
depende del tipo de benchmark
Jornadas Symfony http://decharlas.uji.es/symfony
3 x
6 x
3 x
4 x
Jornadas Symfony http://decharlas.uji.es/symfony
! Utiliza PHP 5.3.2
Jornadas Symfony http://decharlas.uji.es/symfony
20 %
Jornadas Symfony http://decharlas.uji.es/symfony
! Utiliza PHP 5.3.2! lazy-loading
Jornadas Symfony http://decharlas.uji.es/symfony
servicioslistenershelpers
autoloader
PHP 5.3 interoperability
standard
Jornadas Symfony http://decharlas.uji.es/symfony
! Utiliza PHP 5.3.2! lazy-loading! cache
Jornadas Symfony http://decharlas.uji.es/symfony
frontendDevDebugProjectContainer.metafrontendDevDebugProjectContainer.phpfrontendUrlGenerator.metafrontendUrlGenerator.phpfrontendUrlMatcher.metafrontendUrlMatcher.php__TwigTemplate_a242fa75a6db74398d3e6.php
cache/
Jornadas Symfony http://decharlas.uji.es/symfony
! Utiliza PHP 5.3.2! lazy-loading! cache! otros
Jornadas Symfony http://decharlas.uji.es/symfony
> route:dump
RewriteCond %{PATH_INFO} ^/$
RewriteRule .* index.php
[QSA,L,E=_ROUTING__route:portada,E=_ROUTING__c
ontroller:FrontendBundle:Default:index]
RewriteCond %{PATH_INFO} ^/ofertas/([^/\.]+?)$
RewriteRule .* index.php
[QSA,L,E=_ROUTING__route:oferta,E=_ROUTING_id:
%1,E=_ROUTING__controller:FrontendBundle:Defau
lt:oferta]
Jornadas Symfony http://decharlas.uji.es/symfony
! Utiliza PHP 5.3.2! lazy-loading! cache! otros! acelerador web
Jornadas Symfony http://decharlas.uji.es/symfony
Apache
Jornadas Symfony http://decharlas.uji.es/symfony
ApacheSquid
Jornadas Symfony http://decharlas.uji.es/symfony
ApacheSquid
Jornadas Symfony http://decharlas.uji.es/symfony
Symfony2 incluye un acelerador web
creado con PHP
Jornadas Symfony http://decharlas.uji.es/symfony
Apache Acelerador Aplicación
Jornadas Symfony http://decharlas.uji.es/symfony
El acelerador guarda en la cache páginas completas
Jornadas Symfony http://decharlas.uji.es/symfony
$respuesta->setExpires(...);
$respuesta->setMaxAge(...);
$respuesta->setTtl(...);
$respuesta->setLastModified(...);
Jornadas Symfony http://decharlas.uji.es/symfony
public function indexAction()
{
$respuesta = $this->render(
'FrontendBundle:Default:index',
array('ofertas' => $ofertas)
);
$respuesta->setMaxAge(60);
return $respuesta;
}
Jornadas Symfony http://decharlas.uji.es/symfony
El acelerador minimiza las veces que se
ejecuta la aplicación
Jornadas Symfony http://decharlas.uji.es/symfony
Jornadas Symfony http://decharlas.uji.es/symfony
5 minutos1 minuto
5 minutos
1 minuto
180 minutos
180 minutos
5 minutos
Jornadas Symfony http://decharlas.uji.es/symfony
ESI Language Specification 1.0
Edge Side Includes (ESI) is an XML-based markup language that provides a means to assemble resources in HTTP clients. Unlike other in-markup languages, ESI is designed to leverage client tools like caches to improve end-user perceived performance, reduce processing overhead on the origin server, and enhanced availability. ESI allows for dynamic content assembly at the edge of the network, whether it is in a Content Delivery Network, end-user's browser, or in a "Reverse Proxy" right next to the origin server.
ESI is primarily intended for processing on surrogates (intermediaries that operate on behalf of the origin server, also known as "Reverse Proxies") that understand the ESI language. However, its application is not restricted to these devices. The control of where ESI is processed is addressed in the Edge Architecture Specification. Its capability token is ESI/1.0 ESI allows surrogates to treat parts of pages as cacheable resources, which gives them the ability to serve resources from cache in more situations.
IETF HTTP/1.1, part 6: CachingAbstract
The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. This document is Part 6 of the seven-part specification that defines the protocol referred to as "HTTP/1.1" and, taken together, obsoletes RFC 2616. Part 6 defines requirements on HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.
Jornadas Symfony http://decharlas.uji.es/symfony
...
<?php $view->actions->render(
'BolsaBundle::cotizaciones'
) ?>
...
Jornadas Symfony http://decharlas.uji.es/symfony
...
<?php $view->actions->render(
'BolsaBundle::cotizaciones',
array('standalone' => true)
) ?>
...
Jornadas Symfony http://decharlas.uji.es/symfony
<esi:include src="..." />
Jornadas Symfony http://decharlas.uji.es/symfony
! Utiliza PHP 5.3.2! lazy-loading! cache! otros! acelerador web
Jornadas Symfony http://decharlas.uji.es/symfony
100veces más rápido
que symfony 1
Jornadas Symfony http://decharlas.uji.es/symfony
EXCLUSIVO
EXCLUSIVOEXCLUSIVO
EXCLUSIVO
EXCLUSIVO
EXCLUSIVO
EXCLUSIVO
EXCLUSIVO
Jornadas Symfony http://decharlas.uji.es/symfony
modular
fácilestándar
completo
rápido
Jornadas Symfony http://decharlas.uji.es/symfony
50%menos memoria que
symfony 1
Jornadas Symfony http://decharlas.uji.es/symfony
Y mucho más...
Jornadas Symfony http://decharlas.uji.es/symfony
Symfony2 está siendo desarrollado en estos momentos!
Jornadas Symfony http://decharlas.uji.es/symfony
autoloading eventos bundles
cache formularios doctrine
controlador validador propel
CLI admin generator request/response
configuración helpers enrutamiento
base de datos i18n usuario
debug logger pruebas
escape mailer vista
Jornadas Symfony http://decharlas.uji.es/symfony
primera versión alpha
septiembre
Jornadas Symfony http://decharlas.uji.es/symfony
lanzamiento previsto
finales 2010
Jornadas Symfony http://decharlas.uji.es/symfony
Muchas gracias
Jornadas Symfony http://decharlas.uji.es/symfony