Betabeers 21 de febrero – Introducción a Symfony

El jueves pasado, 21 de febrero, hice una introducción a Symfony2 en Betabeers Valencia. Betabeers es un encuentro mensual de desarrolladores web y apps que se hace en distintas ciudades y en el que cualquiera puede presentar un proyecto y contar qué tecnologías han usado, problemas que han surgido, etc. y por otra parte también se pueden presentar charlas o talleres para explicar un lenguaje, framework, herramienta, etc. y al final se hace networking con cervezas.

Este betabeers, al igual que los últimos, se realizó en el Workether, un espacio de coworking en el que además de este, hacen otros eventos. La verdad que se lo curran cediendo el sitio y el material necesario, además de las cervezas.

En lugar de presentar proyectos se hicieron dos charlas, en la otra Felipe Talavera y José Luís Salas de peerTransfer contaron cómo ha ido evolucionando su infraestructura de servidores desde que empezaron hasta el sistema actual, cómo han ido automatizando procesos, monitorizando y adaptando el sistema a sus necesidades. Las transparencias las podéis encontrar aquí.

Introducción a Symfony2

Bueno antes que nada la presentación la podéis encontrar aquí:

sf2.showmethecode.es/slides/index.html

Está hecha con reveal.js, un framework para hacer presentaciones en HTML muy potente y con una sintaxis muy sencilla, por ejemplo una slide es simplemente esto:

No estuve mirando mucho, pero me pareció muy sencillo de usar, con un resultado muy bueno y tiene un montón de funcionalidades.

Respecto a la charla uno de los fallos que tuve es que creo que metí demasiado contenido, quise abarcar demasiado en poco tiempo y hay cosas que son muy difíciles de explicar en tan poco tiempo, supongo que también por haber sido la primera charla, para próximas (si las hay, que espero que sí) es algo que procuraré tener en cuenta.

Voy a hacer un repaso a los puntos que me parece que quedaron más flojos añadiendo algunos enlaces y comentarios. Varias de estas dudas creo que se resolverán al leer el Quick Tour donde se hace un repaso a Symfony2 en 10 minutos y se pueden ver los conceptos más importantes.

Los principios fundamentales de Symfony2 están centrados en la especificación HTTP

Este es un punto importante, de hecho es la primera sección de la documentación oficial (en español).

YouPorn el desarrollo más grande en Symfony2

Esta es la presentación y el vídeo que explican su infraestructura.

Inyección de dependencias

En un artículo de Fabien Potencier lo explica, vamos a verlo aquí resumido con un ejemplo. Tenemos la siguiente clase:

Esta clase tiene un atributo storage donde se almacen los datos privados del usuario. El problema que tiene esta clase es que está acomplada con SessionStorage y no es para nada flexible, si queremos por ejemplo añadir la posibilidad de configurar SessionStorage con algún parámetro habría que modificar el constructor de User o si queremos cambiar que en vez de guardarse los datos en la sesión se guarden en un fichero o en una base de datos tendríamos que modificar la clase User. Esto no tiene buena pinta, deberíamos ser capaces de modificar la forma en la que se guardan los datos sin modificar la clase User y aquí es donde entra en juego la inyección de dependencias, que no es más que en lugar de crear la dependencia dentro de la clase inyectarla, en este caso por constructor:

Simplemente con esto ya no tenemos que modificar la clase User cada vez que queramos modificar la forma en la que se guardan los datos. De esta forma es un poco más largo crear una instancia de User, pero hemos ganado muchísimo en flexibilidad. Dando un paso más podemos añadir una interfaz de forma que sabemos a qué métodos podemos llamar:

Resumiendo, en vez de crear la dependencia dentro de la clase, pasarla desde fuera y para eso hay 3 formas, por constructor como hemos visto (cuando las dependencias son obligatorias), con un setter (para dependencias opcionales) o mediante propiedades.

Del componente Dependency Injection hay bastante documentación en la página oficial.

Bundles

Según el glosario de términos de Symfony2:

Un Bundle es un directorio que contiene un conjunto de ficheros (ficheros PHP, CSSs, JavaScrips, imágenes, …) que implementa una única funcionalidad (un blog, un foro, etc). En Symfony2, (casi) todo está dentro de un bundle.

Es un concepto similar a plugin, pero mejor. En Symfony2 todo son bundles incluido el core framework (FrameworkBundle), se puede leer más acerca de los bundles en la documetación oficial y en el Quick Tour.

Composer

Doctrine

Documentación sobre Doctrine ORM en symfony.com

Twig

El tema de la herencia simple con ejemplos se ve mucho mejor. Tenemos la siguiente plantilla base que llamaremos base.html.twig:

Tiene definidos 3 bloques (title, body y javascript), el de title y javascript llevan código. Esta plantilla nos valdrá para toda la aplicación, ahora definimos otra plantilla layout.html.twig:

Esta plantilla extiende de la anterior, cuando una plantilla extiende de otra sólo puede definir los bloques definidos en la plantilla de la que extiende y superiores, esto quiere decir que sólo podemos definir los bloques title, javascript y body, dentro de estos bloques podemos definir más. En este caso sólo definimos el bloque body y dentro definimos dos más, content y sidebar este último con contenido por defecto.

Ahora creamos última plantilla que será la que tenga el contenido, index.html.twig:

Como vemos esta plantilla extiende de layout.html.twig y define el bloque javascripts y title de base.html.twig y content de layout.html.twig. Dentro del bloque de javascripts vemos la llamada a {{ parent() }}, esto significa que se imprimirá en este punto el contenido del bloque padre que se está sobrescribiendo. Finalmente cuando se muestre esta plantilla el resultado será:

Para saber más acerca de Twig hay una ponencia de Desymfony 2011 de Javier Eguiluz.