You are on page 1of 201

Jornadas Symfony

http://decharlas.uji.es/symfony organizan patrocinan

5 y 6 de julio 2010 Universitat Jaume I, Castelln

colaboran

NOTA
Esta presentacin es la versin simplificada de la que se utiliz en las primeras Jornadas Symfony. La presentacin original est llena de efectos grficos y animaciones imposibles de utilizar en slideshare.net Puedes ver la grabacin en vdeo de la presentacin original en http://bit.ly/symfony2

Jornadas Symfony

http://decharlas.uji.es/symfony

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

Jornadas Symfony

http://decharlas.uji.es/symfony

Symfony 2
Javier Eguluz, symfony.es

Jornadas Symfony
http://decharlas.uji.es/symfony

5 y 6 de julio 2010 Universitat Jaume I, Castelln

sesin patrocinada por

www.ideatea.com

Jornadas Symfony

http://decharlas.uji.es/symfony

Qu es Symfony 2?

Jornadas Symfony

http://decharlas.uji.es/symfony

symfony
Jornadas Symfony http://decharlas.uji.es/symfony

Symfony2
Jornadas Symfony http://decharlas.uji.es/symfony

En qu se diferencian sf 1 y sf2?

Jornadas Symfony

http://decharlas.uji.es/symfony

en todo
Jornadas Symfony http://decharlas.uji.es/symfony

en casi todo
Jornadas Symfony http://decharlas.uji.es/symfony

La evolucin de Symfony

Jornadas Symfony

http://decharlas.uji.es/symfony

sf 1.0

2007

symfony

Jornadas Symfony

http://decharlas.uji.es/symfony

sf 1.2
sfRequest sfResponse sfCache sfRouting sfYAML sfWidget sfLogger sfDatabase sfValidator sfI18N sfForm

2008
sfUser sfStorage

sfEventDispatcher sfOutputEscaper sfCoreAutoload

symfony
Jornadas Symfony

http://decharlas.uji.es/symfony

sf 1.4

2009

symfony

Jornadas Symfony

http://decharlas.uji.es/symfony

Por qu reescribirlo todo de nuevo?

Jornadas Symfony

http://decharlas.uji.es/symfony

Problemas Muchos archivos Configuracin Formularios LENTO Difcil de aprender

:)

Jornadas Symfony

http://decharlas.uji.es/symfony

Nuestro primer proyecto Symfony2

Jornadas Symfony

http://decharlas.uji.es/symfony

5.3.2
Jornadas Symfony

subversion
http://decharlas.uji.es/symfony

> git clone http://github.com/symfony/ symfony-sandbox.git

Jornadas Symfony

http://decharlas.uji.es/symfony

symfony 1.4 sandbox

8.5 MB 3.919 archivos 3 MB 2.244 archivos

1.x

2.x

Symfony2 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 cdigo fuente

Jornadas Symfony

http://decharlas.uji.es/symfony

1.x
<?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); } } public function touch($files) { if (!is_array($files)) { $files = array($files); } foreach ($files as $file) { touch($file); } } <?php class Filesystem {

2.x
public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; } return @mkdir($path, $mode, true); }

Jornadas Symfony

http://decharlas.uji.es/symfony

1.x
<?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); } } <?php class Filesystem {

2.x
public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; }

public function touch($files) { if (!is_array($files)) { $files = array($files); } foreach ($files as $file) { touch($file); } }

EAR /P end Z
return @mkdir($path, $mode, true);

Jornadas Symfony

http://decharlas.uji.es/symfony

1.x
<?php class sfFilesystem { public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; } return @mkdir($path, $mode, true); } <?php class Filesystem {

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

public function touch($files) { if (!is_array($files)) { $files = array($files); } foreach ($files as $file) { touch($file); } }

4 espacios

Jornadas Symfony

http://decharlas.uji.es/symfony

1.x
<?php class sfFilesystem { public function mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; } return @mkdir($path, $mode, true); } <?php class Filesystem {

2.x
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 ( ) { ... }

public function touch($files) { if (!is_array($files)) { $files = array($files); } foreach ($files as $file) { touch($file); } }

if ( ) { ... }

Jornadas Symfony

http://decharlas.uji.es/symfony

<?php namespace Symfony\Framework\FoundationBundle; use use use use Symfony\Components\...\ContainerInterface; Symfony\Components\HttpKernel\Request; Symfony\Components\HttpKernel\Response; 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\Components Symfony\Framework Symfony\Foundation

Jornadas Symfony

http://decharlas.uji.es/symfony

Symfony\Components
BrowserKit Console CssSelector DomCrawler Finder I18N Routing Yaml
http://decharlas.uji.es/symfony

DependencyInjection EventDispatcher Form OutputEscaper Templating


Jornadas Symfony

File HttpKernel Process Validator

completo xxxxxx xxxxx xxxxxxxx xxxxxx


Jornadas Symfony http://decharlas.uji.es/symfony

Estructura del proyecto

Jornadas Symfony

http://decharlas.uji.es/symfony

1.x mi_proyecto/ apps/ frontend/ cache/ config/ data/ lib/ log/ plugins/ test/ web/
Jornadas Symfony

2.x mi_proyecto/ frontend/ src/ web/

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

1.x

2.x

7 archivos 124 lneas

3 archivos 35 lneas

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

1.x

2.x

Proyecto Aplicacin Mdulo

Proyecto Aplicacin Bundle

Jornadas Symfony

http://decharlas.uji.es/symfony

Aplicacin 1

Proyecto
Mdulo 2
Plugins

Mdulo 1 Mdulo 3
Aplicacin 2

Plugin 1

Plugin 2 Mdulo 5

Mdulo 4

Plugin 3

Jornadas Symfony

http://decharlas.uji.es/symfony

Aplicacin 1 Aplicacin 2

Proyecto
Mdulo 2 Mdulo 3

Mdulo 1

Mdulo 4

Mdulo 5

Plugin 1

Plugin 2

Plugin 3

Jornadas Symfony

http://decharlas.uji.es/symfony

Aplicacin 1 Aplicacin 2

Proyecto
Bundle 2 Bundle 3

Bundle 1

Bundle 4

Bundle 5

Bundle 6

Bundle 7

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

Proyecto

1.x

jobeet
Aplicaciones

frontend, backend
Mdulos

oferta, categora, empresa


Jornadas Symfony http://decharlas.uji.es/symfony

Proyecto

2.x

jobeet
Aplicaciones

frontend, backend
Bundle

frontend, backend
Jornadas Symfony http://decharlas.uji.es/symfony

Proyecto

2.x

jobeet
Aplicaciones

frontend, backend
Bundle

oferta, categora, empresa


Jornadas Symfony http://decharlas.uji.es/symfony

Proyecto

2.x

jobeet
Aplicaciones

frontend, backend
Bundle

frontend, backend, oferta, categora, empresa


Jornadas Symfony http://decharlas.uji.es/symfony

1.x

2.x

Aplicacin Mdulo Plugin Libreras


Jornadas Symfony http://decharlas.uji.es/symfony

Bundle

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

completo modular xxxxx xxxxxxxx xxxxxx


Jornadas Symfony http://decharlas.uji.es/symfony

Inyeccin de Dependencias

Jornadas Symfony

http://decharlas.uji.es/symfony

Inyeccin de Dependencias Inversion of Control


Jornadas Symfony

DI IoC
http://decharlas.uji.es/symfony

Inyeccin de Dependencias

DI

Jornadas Symfony

http://decharlas.uji.es/symfony

1.x

2.x

sfConfig
sfProjectConfiguration sfAppConfiguration

sfContext config handlers ...


Jornadas Symfony

DI
http://decharlas.uji.es/symfony

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

D ependency I njection C ontainer


Jornadas Symfony http://decharlas.uji.es/symfony

DIC =
Jornadas Symfony

configuracin flexible

http://decharlas.uji.es/symfony

frontend/config/config.yml swift.mailer: transport: gmail username: xxxxxxxx password: xxxxxxxx src/FrontendBundle/Controller/DefaultController.php public function emailAction() { $mailer = $this->getMailer(); $mensaje = \Swift_Message::newInstance() ->setSubject('Asunto') ->...
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

ORM DBAL

PDO
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

slot layout partial plantilla component component slot


Jornadas Symfony

plantilla slot

http://decharlas.uji.es/symfony

1.x

2.x

slot slot layout plantilla + slot partial plantilla plantilla plantilla component plantilla + accin component slot plantilla + accin
Jornadas Symfony http://decharlas.uji.es/symfony

completo modular fcil xxxxxxxx xxxxxx


Jornadas Symfony http://decharlas.uji.es/symfony

1.x
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php echo $sf_content ?> </body> </html>

Jornadas Symfony

http://decharlas.uji.es/symfony

2.x
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php $view->slots->output('_content') ?> </body> </html>

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' );

Jornadas Symfony

http://decharlas.uji.es/symfony

$view->extend( 'PlantillasBundle::layout_seccion' );

Jornadas Symfony

http://decharlas.uji.es/symfony

$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

1.x
<?php include_stylesheets() ?> <?php use_stylesheet('main.css') ?>

2.x
<?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 Heinemeier
RailsConf 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

PHP
<h1><?php echo $oferta['titulo'] ?></h1>

twig
<h1>{{ oferta.titulo }}</h1>

Jornadas Symfony

http://decharlas.uji.es/symfony

PHP
<a href="<?php echo $view->router->generate('portada') ?>"> Volver a la portada </a>

twig
<a href="{% route 'portada' %}"> Volver a la portada </a>

Jornadas Symfony

http://decharlas.uji.es/symfony

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

twig

http://decharlas.uji.es/symfony

twig
! Cdigo conciso ! Diseadores ! Ultra-rpido
Jornadas Symfony http://decharlas.uji.es/symfony

El controlador

Jornadas Symfony

http://decharlas.uji.es/symfony

routing.yml

1.x

routing.yml
bundle

2.x

bundle

bundle

bundle

Jornadas Symfony

http://decharlas.uji.es/symfony

apps/frontend/config/config.yml

1.x

homepage: url: / param: { module: default, action: index }

frontend/config/config.yml

2.x

homepage: pattern: / defaults: { _bundle: FoundationBundle , _controller: Default, _action: index }


Jornadas Symfony http://decharlas.uji.es/symfony

homepage: pattern: / defaults: { _bundle: FoundationBundle , _controller: Default, _action: index }

homepage: pattern: / defaults: { _controller: FoundationBundle:Default:index }

Jornadas Symfony

http://decharlas.uji.es/symfony

frontend/config/routing.yml

2.x

homepage: pattern: / defaults: { _controller: FoundationBundle:Default:index } frontend: resource: FrontendBundle/Resources/ config/routing.yml

Jornadas Symfony

http://decharlas.uji.es/symfony

oferta: pattern: ...

/ofertas/:id

public function ofertaAction($id) { ... }

Jornadas Symfony

http://decharlas.uji.es/symfony

oferta: pattern: ...

/ofertas/:seccion/:categoria

public function ofertaAction($seccion, $categoria) { ... }

Jornadas Symfony

http://decharlas.uji.es/symfony

public function indexAction() { $this->ofertas = $ofertas; }

1.x

*Se supone que la plantilla es indexSuccess.php 2.x

public function indexAction() { return $this->render( 'FrontendBundle:Default:index', array('ofertas' => $ofertas) ); }


Jornadas Symfony

http://decharlas.uji.es/symfony

Formularios

Jornadas Symfony

http://decharlas.uji.es/symfony

1.x Form sfForm


Modelo Modelo

Controlador

2.x

Jornadas Symfony

http://decharlas.uji.es/symfony

1.x sfForm

Controlador

Modelo

2.x Form

Modelo
http://decharlas.uji.es/symfony

Jornadas 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')) ));

Contrasea Repite la contrasea

Jornadas Symfony

http://decharlas.uji.es/symfony

$form->add(new CollectionField( new TextField('telefonos')) ));

Telfono 1 Telfono 2 Telfono 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);

Direccin Calle Nmero


Jornadas Symfony

Piso

CP
http://decharlas.uji.es/symfony

TextField TextareaField CheckboxField ChoiceField PasswordField HiddenField


Jornadas Symfony

RepeatedField CollectionField FieldGroup

http://decharlas.uji.es/symfony

TextField TextareaField CheckboxField ChoiceField PasswordField HiddenField


Jornadas Symfony

RepeatedField CollectionField FieldGroup NumberField IntegerField PercentField


i18n

MoneyField DateField BirthdayField TimeField

i18n

i18n

i18n

i18n

i18n

DateTimeField TimezoneField

i18n

i18n

i18n

http://decharlas.uji.es/symfony

Validacin

Jornadas Symfony

http://decharlas.uji.es/symfony

1.x sfForm sfValidator Form

2.x

Validador Controlador

Modelo Modelo
Jornadas Symfony http://decharlas.uji.es/symfony

1.x sfForm Form Validador sfValidator

2.x

Form
Validador

Controlador

Modelo
Jornadas Symfony

Modelo
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

Estndares

Jornadas Symfony

http://decharlas.uji.es/symfony

1.x

2.x

sfCache sfLogger sfValidator autoload lime


Jornadas Symfony

Zend_Cache Zend_Logger Java JSR 303 PHP 5.3 autoload PHPUnit


http://decharlas.uji.es/symfony

completo modular fcil estndar xxxxxx


Jornadas Symfony http://decharlas.uji.es/symfony

Rendimiento

Jornadas Symfony

http://decharlas.uji.es/symfony

100
veces ms rpido que symfony 1
Jornadas Symfony http://decharlas.uji.es/symfony

100
veces ms rpido que symfony 1
Jornadas Symfony

depende de l tipo de benchm ark

http://decharlas.uji.es/symfony

3x 3x 4x 6x
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

autoloader
PHP 5.3 interoperability standard

servicios listeners helpers


http://decharlas.uji.es/symfony

Jornadas Symfony

! Utiliza PHP 5.3.2 ! lazy-loading ! cache

Jornadas Symfony

http://decharlas.uji.es/symfony

cache/
frontendDevDebugProjectContainer.meta frontendDevDebugProjectContainer.php frontendUrlGenerator.meta frontendUrlGenerator.php frontendUrlMatcher.meta frontendUrlMatcher.php __TwigTemplate_a242fa75a6db74398d3e6.php

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

Squid Apache

Jornadas Symfony

http://decharlas.uji.es/symfony

Squid Apache

Jornadas Symfony

http://decharlas.uji.es/symfony

Symfony2 incluye un acelerador web creado con PHP


Jornadas Symfony http://decharlas.uji.es/symfony

Apache

Acelerador Aplicacin

Jornadas Symfony

http://decharlas.uji.es/symfony

El acelerador guarda en la cache pginas 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 aplicacin


Jornadas Symfony http://decharlas.uji.es/symfony

Jornadas Symfony

http://decharlas.uji.es/symfony

180 minutos 1 minuto 5 minutos 180


minutos
1 minuto

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

IETF HTTP/1.1, part 6: Caching

ESI is primarily intended for processing on surrogates (intermediaries that operate on behalf of theAbstract origin server, also known as "Reverse Proxies") that understand the ESI language. However, its application is The Hypertext Transfer ESI is processed is not restricted to these devices. The control of where Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information addressed in the Edge Architecture Specification. Its capability token is systems. This of pages as cacheable ESI/1.0 ESI allows surrogates to treat parts document is Part 6 of the seven-part specification resources, which gives them that ability tothe protocol referred to as "HTTP/1.1" and, taken the defines serve resources from cache together, obsoletes RFC 2616. Part 6 defines requirements on in more situations. 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

100
veces ms rpido que symfony 1
Jornadas Symfony http://decharlas.uji.es/symfony

EXCLUSIVO

EXCLUSIVO
EXCLUSIVO

EXCLUSIVO

EXCLUSIVO EXCLUSIVO
Jornadas Symfony

EXCLUSIVO

EXCLUSIVO

http://decharlas.uji.es/symfony

completo modular fcil estndar rpido


Jornadas Symfony http://decharlas.uji.es/symfony

50%
menos memoria que symfony 1
Jornadas Symfony http://decharlas.uji.es/symfony

Y mucho ms...

Jornadas Symfony

http://decharlas.uji.es/symfony

!
Jornadas Symfony

siendo desarrollado en estos momentos

Symfony2 est

http://decharlas.uji.es/symfony

autoloading cache controlador CLI configuracin base de datos debug escape


Jornadas Symfony

eventos formularios validador

bundles doctrine propel

admin generator request/response helpers i18n logger mailer enrutamiento usuario pruebas vista
http://decharlas.uji.es/symfony

septiembre
Jornadas Symfony http://decharlas.uji.es/symfony

primera versin alpha

finales 2010
Jornadas Symfony http://decharlas.uji.es/symfony

lanzamiento previsto

Muchas gracias
Jornadas Symfony http://decharlas.uji.es/symfony

Preguntas
javier.eguiluz@gmail.com
Jornadas Symfony http://decharlas.uji.es/symfony

You might also like