Introducción a Symfony2
Javier Eguiluz



JORNADAS SYMFONY 2011 1-3 JULIO, CASTELLÓN DESYMFONY.COM
Patrocinadores   Patrocinadores   Patrocinadores
Colaboradores      BRONCE            PLATA        PLATINO y ORO    JORNADAS SYMFONY 2011 están patrocinadas por
importante
Algunas partes de esta presentación
no se pueden entender bien sin ver
el vídeo de su impartición.

Puedes acceder al vídeo en
http://bit.ly/sf-tutorial1
« framework PHP »
1 2 3 4 5 6 7 8 9 10



     Versátil
full!stack
framework
full!stack   components
framework     framework
full!stack   components    micro



                          !
framework     framework   framework
full!stack   components    micro



                          !
framework     framework   framework
BrowserKit        EventDispatcher    Routing      Proyecto
                                                  Symfony
ClassLoader             Finder       Security

  Config                 Form       Serializer
                                                  21
  Console         HttpFoundation    Templating
                                                  librerías
CssSelector           HttpKernel    Translation

DependencyInjection     Locale       Validator

DomCrawler              Process        Yaml
BrowserKit    EventDispatcher       Routing

  ClassLoader             Finder      Security

    Config                Form       Serializer

   Console      HttpFoundation       Templating

  CssSelector           HttpKernel   Translation

  DependencyInjection      Locale     Validator

  DomCrawler             Process        Yaml


componentes
BrowserKit    EventDispatcher       Routing

  ClassLoader             Finder      Security

    Config                Form       Serializer

   Console      HttpFoundation       Templating

  CssSelector           HttpKernel   Translation
                                                   Assetic        Monolog
  DependencyInjection      Locale     Validator

  DomCrawler             Process        Yaml       Doctrine     SwiftMailer

componentes                                                   librerías externas
BrowserKit    EventDispatcher       Routing

  ClassLoader             Finder      Security

    Config                Form       Serializer

   Console      HttpFoundation       Templating

  CssSelector           HttpKernel   Translation
                                                   Assetic        Monolog
  DependencyInjection      Locale     Validator

  DomCrawler             Process        Yaml       Doctrine     SwiftMailer

componentes                                                   librerías externas


 SecurityBundle            DoctrineBundle FrameworkBundle        +6 Bundles

                                                                       bundles
BrowserKit    EventDispatcher       Routing

  ClassLoader             Finder      Security
                                                      Framework
    Config                Form       Serializer
                                                     Symfony2
   Console      HttpFoundation       Templating

  CssSelector           HttpKernel   Translation
                                                   Assetic        Monolog
  DependencyInjection      Locale     Validator

  DomCrawler             Process        Yaml       Doctrine     SwiftMailer

componentes                                                   librerías externas


 SecurityBundle            DoctrineBundle FrameworkBundle        +6 Bundles

                                                                       bundles
BrowserKit    EventDispatcher    Routing

  ClassLoader
                                               Framework
                                               Symfony2
                HttpFoundation    Templating

  CssSelector       HttpKernel



  DomCrawler                        Yaml


componentes
BrowserKit    EventDispatcher    Routing     !Framework
  ClassLoader
                                                 Silex
                HttpFoundation    Templating

  CssSelector       HttpKernel



  DomCrawler                        Yaml


componentes


                 1 archivo                     400 KB
1 2 3 4 5 6 7 8 9 10



       Útil
¿ Por qué utilizar un
framework bueno ?
retos de la programación web
 •   persistencia datos              •   rendimiento
 •   seguridad                       •   cache
 •   formularios                     •   archivos web
 •   validación                      •   internacionalización
 •   plantillas                      •   tareas programadas
 •   archivos de log                 •   enrutamiento


      Fuente: Ryan Weaver, http://slidesha.re/iuptB2 (pág. 9)
lo que soluciona Symfony2
•   persistencia datos              •   rendimiento
•   seguridad                       •   cache
•   formularios                     •   archivos web
•   validación                      •   internacionalización
•   plantillas                      •   tareas programadas
•   archivos de log                 •   enrutamiento


     Fuente: Ryan Weaver, http://slidesha.re/iuptB2 (pág. 9)
industrialización
1 2 3 4 5 6 7 8 9 10



Buenas prácticas
<http>
  <intercept-url pattern='/login.htm*' filters='none'/>
  <intercept-url pattern='/**' access='ROLE_USER' />
  <form-login login-page='/login.htm'
              default-target-url='/home.htm'
              always-use-default-target='true' />
</http>
<http>
  <intercept-url pattern='/login.htm*' filters='none'/>
  <intercept-url pattern='/**' access='ROLE_USER' />
  <form-login login-page='/login.htm'
              default-target-url='/home.htm'
              always-use-default-target='true' />
</http>


firewalls:
  login:
    pattern:     ^/login
    anonymous: ~
  all:
    pattern:     ^/
    form_login:
       login_path:                     /login
       default_target_path:            /home.htm
       always_use_default_target_path: true
EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1");
EntityManager em = emf.createEntityManager();
Usuario anonimo = new Usuario();
anonimo.setNombre("Anónimo");
anonimo.setEdad(20);
em.persist(anonimo);
em.flush();
EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1");
EntityManager em = emf.createEntityManager();
Usuario anonimo = new Usuario();
anonimo.setNombre("Anónimo");
anonimo.setEdad(20);
em.persist(anonimo);
em.flush();


$em = $this->get('doctrine')->getEntityManager();
$anonimo = new Usuario();
$anonimo->setNombre("Anónimo");
$anonimo->setEdad(20);
$em->persist($anonimo);
$em->flush();
ruby script/generate model
  Articulo
  titulo:string body:text
ruby script/generate model
  Articulo
  titulo:string body:text




php app/console doctrine:generate:entity
  MiBundle:Articulo
  "titulo:string(255) body:text"
{% extends "base_generic.html" %}
{% block title %} {{ seccion.titulo }} {% endblock %}
{% block content %}
<h1> {{ seccion.titulo }} </h1>
{% for articulo in articulos %}
  <h2> {{ articulo.titulo|upper }} </h2>
{% endfor %}
{% endblock %}
{% extends "base_generic.html" %}
{% block title %} {{ seccion.titulo }} {% endblock %}
{% block content %}
<h1> {{ seccion.titulo }} </h1>
{% for articulo in articulos %}
  <h2> {{ articulo.titulo|upper }} </h2>
{% endfor %}
{% endblock %}

{% extends "::base_generic.html" %}
{% block title %} {{ seccion.titulo }} {% endblock %}
{% block content %}
<h1> {{ seccion.titulo }} </h1>
{% for articulo in articulos %}
  <h2> {{ articulo.titulo|upper }} </h2>
{% endfor %}
{% endblock %}
Twig




Assetic
Monolog
1 2 3 4 5 6 7 8 9 10



     Flexible
novato   clásico   experto
YAML
novato   clásico   experto
YAML
   XML
novato   clásico   experto
YAML
   XML
   PHP
novato   clásico   experto
archivos de configuración


YAML XML PHP
plantillas




Twig        PHP
almacenamiento




SQL      NoSQL
Configuración       PHP    XML    YAML

Plantillas         PHP   Twig

Almacenamiento     SQL   NoSQL

Flujo de trabajo   Anotaciones Archivos
1 2 3 4 5 6 7 8 9 10



  Rendimiento
« La gran obsesión de
     Symfony2 »
5.3.2
archivos de configuración


 PHP      YAML      XML
todo se transforma a PHP
PHP              Caché




   YAML XML
PHP           Caché




Twig              anotaciones


       YAML XML
Aplicación




   BD
Aplicación




   BD
Aplicación




   BD
Aplicación




   BD
Reverse Proxy



         Aplicación




                BD
Reverse Proxy



         Aplicación




                BD
1 2 3 4 5 6 7 8 9 10



     Soporte
1.x
        Feb.    Dic.     Dic.      Nov.
        2007    2008     2009      2012


      1.0      1.2     1.4      1.4.x

2.x     Jul.
        2011
                                   Jun.
                                   2016


      2.0                       2.x
hace 5 años no existía
1 2 3 4 5 6 7 8 9 10



Documentación
10 libros 8 idiomas 15.000 págs.
The                   The
Book                  Cookook
~ 200 págs.           +50 recetas




Reference             API
cientos de opciones   cientos de
de configuración      métodos
1 2 3 4 5 6 7 8 9 10



   Comunidad
+200
+200
61        43           170              32

     Fuente: Github & andrewnacin.com
Doctrine      Behat
  Imagine        Silex
Assetic Propel
SwiftMailer    Twig
Kris                   Jonathan           Sebastian
        Wallsmith              H. Wage            Bergmann


     Nils              François            Thibault
Adermann               Zaninotto          Duplessis



        Bulat                  Benjamin           Konstantin
        Shakirzyanov           Eberlei            Kudryashov


   Lukas                 Ryan             Bernhard
 K. Smith               Weaver            Schussek
siwapp.org
diem-project.org   apostrophenow.org
phpbb.com
1 2 3 4 5 6 7 8 9 10



   Visionario
Fabien
 Potencier
      Fundador y
  responsable del
proyecto Symfony




                    Foto: Guillaume Ponçon
Symfony 1 requerirá como
   mínimo PHP 5.2.4

            Fabien Potencier
               Octubre 2005
Doctrine 2.0 es una de las
mejores cosas que le han
      pasado a PHP

             Fabien Potencier
                Octubre 2009
Symfony2 tendrá un
contenedor de Inyección
de Dependencias basado
       en Spring
           Fabien Potencier
           Septiembre 2008
Twig será el formato por
defecto de las plantillas de
        Symfony2
              Fabien Potencier
              Septiembre 2010
1 2 3 4 5 6 7 8 9 10



     Popular
#1   para
     programadores

 Fuente: Github
páginas vistas
500000



375000



250000



125000



     0
watchers
3000



2250



1500



 750



   0
forks
700



525



350



175



  0
pull requests
1500



1125



 750



 375



   0
#1    para el público
      en general

 Fuente: Google Trends
popularidad              España, 2011




   0    0,25       0,5         0,75   1



       Fuente: Google Trends
#1 Argentina
                                #1 Colombia
                                #1 Chile
                                #1 Cuba
                                #1 Mexico
                                #1 Perú
                                #1 Uruguay
Fuente: Google Trends & Alexa
                                #1 Venezuela
#1   en ofertas de
     trabajo

 Fuente: Infojobs
#1
Fuente: deSymfony
Symfony2 es
1. versátil           2. útil
3. buenas prácticas   4. flexible
5. rendimiento        6. soporte
7. documentación      8. comunidad
9. visionario         10. popular
contacto
javier.eguiluz@gmail.com
twitter.com/javiereguiluz
linkedin.com/in/javiereguiluz

Desymfony 2011 - Introducción a Symfony2

  • 1.
    Introducción a Symfony2 JavierEguiluz JORNADAS SYMFONY 2011 1-3 JULIO, CASTELLÓN DESYMFONY.COM
  • 2.
    Patrocinadores Patrocinadores Patrocinadores Colaboradores BRONCE PLATA PLATINO y ORO JORNADAS SYMFONY 2011 están patrocinadas por
  • 3.
    importante Algunas partes deesta presentación no se pueden entender bien sin ver el vídeo de su impartición. Puedes acceder al vídeo en http://bit.ly/sf-tutorial1
  • 5.
  • 6.
    1 2 34 5 6 7 8 9 10 Versátil
  • 7.
  • 8.
    full!stack components framework framework
  • 9.
    full!stack components micro ! framework framework framework
  • 10.
    full!stack components micro ! framework framework framework
  • 11.
    BrowserKit EventDispatcher Routing Proyecto Symfony ClassLoader Finder Security Config Form Serializer 21 Console HttpFoundation Templating librerías CssSelector HttpKernel Translation DependencyInjection Locale Validator DomCrawler Process Yaml
  • 12.
    BrowserKit EventDispatcher Routing ClassLoader Finder Security Config Form Serializer Console HttpFoundation Templating CssSelector HttpKernel Translation DependencyInjection Locale Validator DomCrawler Process Yaml componentes
  • 13.
    BrowserKit EventDispatcher Routing ClassLoader Finder Security Config Form Serializer Console HttpFoundation Templating CssSelector HttpKernel Translation Assetic Monolog DependencyInjection Locale Validator DomCrawler Process Yaml Doctrine SwiftMailer componentes librerías externas
  • 14.
    BrowserKit EventDispatcher Routing ClassLoader Finder Security Config Form Serializer Console HttpFoundation Templating CssSelector HttpKernel Translation Assetic Monolog DependencyInjection Locale Validator DomCrawler Process Yaml Doctrine SwiftMailer componentes librerías externas SecurityBundle DoctrineBundle FrameworkBundle +6 Bundles bundles
  • 15.
    BrowserKit EventDispatcher Routing ClassLoader Finder Security Framework Config Form Serializer Symfony2 Console HttpFoundation Templating CssSelector HttpKernel Translation Assetic Monolog DependencyInjection Locale Validator DomCrawler Process Yaml Doctrine SwiftMailer componentes librerías externas SecurityBundle DoctrineBundle FrameworkBundle +6 Bundles bundles
  • 16.
    BrowserKit EventDispatcher Routing ClassLoader Framework Symfony2 HttpFoundation Templating CssSelector HttpKernel DomCrawler Yaml componentes
  • 17.
    BrowserKit EventDispatcher Routing !Framework ClassLoader Silex HttpFoundation Templating CssSelector HttpKernel DomCrawler Yaml componentes 1 archivo 400 KB
  • 18.
    1 2 34 5 6 7 8 9 10 Útil
  • 19.
    ¿ Por quéutilizar un framework bueno ?
  • 20.
    retos de laprogramación web • persistencia datos • rendimiento • seguridad • cache • formularios • archivos web • validación • internacionalización • plantillas • tareas programadas • archivos de log • enrutamiento Fuente: Ryan Weaver, http://slidesha.re/iuptB2 (pág. 9)
  • 21.
    lo que solucionaSymfony2 • persistencia datos • rendimiento • seguridad • cache • formularios • archivos web • validación • internacionalización • plantillas • tareas programadas • archivos de log • enrutamiento Fuente: Ryan Weaver, http://slidesha.re/iuptB2 (pág. 9)
  • 22.
  • 23.
    1 2 34 5 6 7 8 9 10 Buenas prácticas
  • 25.
    <http> <intercept-urlpattern='/login.htm*' filters='none'/> <intercept-url pattern='/**' access='ROLE_USER' /> <form-login login-page='/login.htm' default-target-url='/home.htm' always-use-default-target='true' /> </http>
  • 26.
    <http> <intercept-urlpattern='/login.htm*' filters='none'/> <intercept-url pattern='/**' access='ROLE_USER' /> <form-login login-page='/login.htm' default-target-url='/home.htm' always-use-default-target='true' /> </http> firewalls: login: pattern: ^/login anonymous: ~ all: pattern: ^/ form_login: login_path: /login default_target_path: /home.htm always_use_default_target_path: true
  • 27.
    EntityManagerFactory emf =Persistence.createEntityManagerFactory("manager1"); EntityManager em = emf.createEntityManager(); Usuario anonimo = new Usuario(); anonimo.setNombre("Anónimo"); anonimo.setEdad(20); em.persist(anonimo); em.flush();
  • 28.
    EntityManagerFactory emf =Persistence.createEntityManagerFactory("manager1"); EntityManager em = emf.createEntityManager(); Usuario anonimo = new Usuario(); anonimo.setNombre("Anónimo"); anonimo.setEdad(20); em.persist(anonimo); em.flush(); $em = $this->get('doctrine')->getEntityManager(); $anonimo = new Usuario(); $anonimo->setNombre("Anónimo"); $anonimo->setEdad(20); $em->persist($anonimo); $em->flush();
  • 29.
    ruby script/generate model Articulo titulo:string body:text
  • 30.
    ruby script/generate model Articulo titulo:string body:text php app/console doctrine:generate:entity MiBundle:Articulo "titulo:string(255) body:text"
  • 31.
    {% extends "base_generic.html"%} {% block title %} {{ seccion.titulo }} {% endblock %} {% block content %} <h1> {{ seccion.titulo }} </h1> {% for articulo in articulos %} <h2> {{ articulo.titulo|upper }} </h2> {% endfor %} {% endblock %}
  • 32.
    {% extends "base_generic.html"%} {% block title %} {{ seccion.titulo }} {% endblock %} {% block content %} <h1> {{ seccion.titulo }} </h1> {% for articulo in articulos %} <h2> {{ articulo.titulo|upper }} </h2> {% endfor %} {% endblock %} {% extends "::base_generic.html" %} {% block title %} {{ seccion.titulo }} {% endblock %} {% block content %} <h1> {{ seccion.titulo }} </h1> {% for articulo in articulos %} <h2> {{ articulo.titulo|upper }} </h2> {% endfor %} {% endblock %}
  • 34.
  • 35.
    1 2 34 5 6 7 8 9 10 Flexible
  • 36.
    novato clásico experto
  • 37.
    YAML novato clásico experto
  • 38.
    YAML XML novato clásico experto
  • 39.
    YAML XML PHP novato clásico experto
  • 40.
  • 41.
  • 42.
  • 43.
    Configuración PHP XML YAML Plantillas PHP Twig Almacenamiento SQL NoSQL Flujo de trabajo Anotaciones Archivos
  • 44.
    1 2 34 5 6 7 8 9 10 Rendimiento
  • 45.
    « La granobsesión de Symfony2 »
  • 46.
  • 47.
  • 48.
    todo se transformaa PHP PHP Caché YAML XML
  • 49.
    PHP Caché Twig anotaciones YAML XML
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
    Reverse Proxy Aplicación BD
  • 55.
    Reverse Proxy Aplicación BD
  • 56.
    1 2 34 5 6 7 8 9 10 Soporte
  • 58.
    1.x Feb. Dic. Dic. Nov. 2007 2008 2009 2012 1.0 1.2 1.4 1.4.x 2.x Jul. 2011 Jun. 2016 2.0 2.x
  • 59.
    hace 5 añosno existía
  • 60.
    1 2 34 5 6 7 8 9 10 Documentación
  • 62.
    10 libros 8idiomas 15.000 págs.
  • 63.
    The The Book Cookook ~ 200 págs. +50 recetas Reference API cientos de opciones cientos de de configuración métodos
  • 64.
    1 2 34 5 6 7 8 9 10 Comunidad
  • 65.
  • 66.
    +200 61 43 170 32 Fuente: Github & andrewnacin.com
  • 67.
    Doctrine Behat Imagine Silex Assetic Propel SwiftMailer Twig
  • 68.
    Kris Jonathan Sebastian Wallsmith H. Wage Bergmann Nils François Thibault Adermann Zaninotto Duplessis Bulat Benjamin Konstantin Shakirzyanov Eberlei Kudryashov Lukas Ryan Bernhard K. Smith Weaver Schussek
  • 69.
  • 70.
    diem-project.org apostrophenow.org
  • 71.
  • 72.
    1 2 34 5 6 7 8 9 10 Visionario
  • 73.
    Fabien Potencier Fundador y responsable del proyecto Symfony Foto: Guillaume Ponçon
  • 74.
    Symfony 1 requerirácomo mínimo PHP 5.2.4 Fabien Potencier Octubre 2005
  • 75.
    Doctrine 2.0 esuna de las mejores cosas que le han pasado a PHP Fabien Potencier Octubre 2009
  • 76.
    Symfony2 tendrá un contenedorde Inyección de Dependencias basado en Spring Fabien Potencier Septiembre 2008
  • 77.
    Twig será elformato por defecto de las plantillas de Symfony2 Fabien Potencier Septiembre 2010
  • 78.
    1 2 34 5 6 7 8 9 10 Popular
  • 79.
    #1 para programadores Fuente: Github
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
    #1 para el público en general Fuente: Google Trends
  • 85.
    popularidad España, 2011 0 0,25 0,5 0,75 1 Fuente: Google Trends
  • 86.
    #1 Argentina #1 Colombia #1 Chile #1 Cuba #1 Mexico #1 Perú #1 Uruguay Fuente: Google Trends & Alexa #1 Venezuela
  • 87.
    #1 en ofertas de trabajo Fuente: Infojobs
  • 88.
  • 89.
    Symfony2 es 1. versátil 2. útil 3. buenas prácticas 4. flexible 5. rendimiento 6. soporte 7. documentación 8. comunidad 9. visionario 10. popular
  • 90.