Professional Documents
Culture Documents
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
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
symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
sf 1.4
2009
symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
:)
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
5.3.2
Jornadas Symfony
subversion
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
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;
namespaces
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
Symfony\Components
BrowserKit Console CssSelector DomCrawler Finder I18N Routing Yaml
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
1.x mi_proyecto/ apps/ frontend/ cache/ config/ data/ lib/ log/ plugins/ test/ 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
3 archivos 35 lneas
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
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
Jornadas Symfony
http://decharlas.uji.es/symfony
Proyecto
1.x
jobeet
Aplicaciones
frontend, backend
Mdulos
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
Proyecto
2.x
jobeet
Aplicaciones
frontend, backend
Bundle
1.x
2.x
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
Jornadas Symfony
http://decharlas.uji.es/symfony
Inyeccin de Dependencias
Jornadas Symfony
http://decharlas.uji.es/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
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
$mailer = $this->getMailer();
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
DIC
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
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
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
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
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');
$view->extend('FrontendBundle::layout');
$view->extend('PlantillasBundle::layout');
$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
Jornadas Symfony
http://decharlas.uji.es/symfony
Helpers
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
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
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
frontend/config/config.yml
2.x
Jornadas Symfony
http://decharlas.uji.es/symfony
frontend/config/routing.yml
2.x
Jornadas Symfony
http://decharlas.uji.es/symfony
/ofertas/:id
Jornadas Symfony
http://decharlas.uji.es/symfony
/ofertas/:seccion/:categoria
Jornadas Symfony
http://decharlas.uji.es/symfony
1.x
http://decharlas.uji.es/symfony
Formularios
Jornadas Symfony
http://decharlas.uji.es/symfony
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
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);
Piso
CP
http://decharlas.uji.es/symfony
http://decharlas.uji.es/symfony
i18n
i18n
i18n
i18n
i18n
DateTimeField TimezoneField
i18n
i18n
i18n
http://decharlas.uji.es/symfony
Validacin
Jornadas Symfony
http://decharlas.uji.es/symfony
2.x
Validador Controlador
Modelo Modelo
Jornadas Symfony http://decharlas.uji.es/symfony
2.x
Form
Validador
Controlador
Modelo
Jornadas Symfony
Modelo
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
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
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
PHPUnit 3.5
Jornadas Symfony http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
Estndares
Jornadas Symfony
http://decharlas.uji.es/symfony
1.x
2.x
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
http://decharlas.uji.es/symfony
3x 3x 4x 6x
Jornadas Symfony http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
20 %
Jornadas Symfony http://decharlas.uji.es/symfony
Jornadas Symfony
http://decharlas.uji.es/symfony
autoloader
PHP 5.3 interoperability standard
Jornadas Symfony
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
> 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
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
Apache
Acelerador Aplicacin
Jornadas Symfony
http://decharlas.uji.es/symfony
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
Jornadas Symfony
http://decharlas.uji.es/symfony
5 minutos
5 minutos
Jornadas Symfony http://decharlas.uji.es/symfony
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
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
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
Symfony2 est
http://decharlas.uji.es/symfony
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
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