Symfony2, Jornadas Symfony

Preview:

DESCRIPTION

Esta presentación es la versión simplificada de la que se utilizó en las primeras Jornadas Symfony. Puedes ver la grabación en vídeo de la presentación original en http://bit.ly/symfony2 - - - - - - - This is the simplified version of the presentation used at the first Spanish Symfony Conference. You can watch the video recording of the original presentation at http://bit.ly/symfony2

Citation preview

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('remitente@ejemplo.com')

->setTo('destinatario@ejemplo.com')

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

Preguntasjavier.eguiluz@gmail.com

Recommended