Los frameworks simplifican el desarrollo de las aplicaciones mediante la automatización de muchas de las tareas comunes. Además, un framework proporciona estructura al código fuente, forzando al programador a crear código más legible y más fácil de mantener.

Aunque los frameworks existen desde hace décadas, y los frameworks para aplicaciones web también se utilizan desde hace mucho tiempo, el lanzamiento de Ruby On Rails en 2004 supuso una revolución en el desarrollo de las aplicaciones web que aún hoy continúa.

Symfony sigue la estela de Rails para simplificar al máximo el desarrollo de aplicaciones web profesionales con PHP, utilizando las mejores prácticas y los patrones de diseño más importantes. Symfony incorpora muchas de las ideas del RAD (“desarrollo rápido de aplicaciones”) para conseguir que la programación de las aplicaciones sea lo más productiva, correcta y divertida posible.

¿Qué es Symfony?

Symfony es un framework para construir aplicaciones web con PHP. En otras palabras, Symfony es un enorme conjunto de herramientas y utilidades que simplifican el desarrollo de las aplicaciones web.

Para los iniciados en los frameworks, Symfony es una de las mejores copias para PHP del famoso framework Ruby on Rails. Symfony ha tomado las mejores ideas de Rails y de muchos otros frameworks, ha incorporado ideas propias y el resultado es un framework elegante, estable, productivo y muy bien documentado.

Symfony emplea el tradicional patrón de diseño MVC (modelo-vista-controlador) para separar las distintas partes que forman una aplicación web. El modelo representa la información con la que trabaja la aplicación y se encarga de acceder a los datos.

La vista transforma la información obtenida por el modelo en las páginas web a las que acceden los usuarios. El controlador es el encargado de coordinar todos los demás elementos y transformar las peticiones del usuario en operaciones sobre el modelo y la vista.

Algunos datos importantes sobre Symfony: la primera versión se publicó en Octubre de 2005; su licencia es de tipo software libre; ha sido desarrollado por una empresa francesa llamada Sensio Labs; Yahoo ha elegido Symfony como su framework PHP de desarrollo, con el que ha construido Yahoo Bookmarks (20 millones de usuarios y 12 idiomas) y partes de Yahoo Answers y del.icio.us.

Desarrollando un microblog

La mejor forma de comprobar las posibilidades de Symfony y de compararlo con otros frameworks consiste en programar alguna aplicación. Debido a las limitaciones de espacio de este artículo, se va a programar un microblog, formado solamente por artículos y comentarios.

Los artículos disponen de título, contenido y fecha de creación. Los comentarios disponen de autor, contenido y fecha de creación. La relación de las tablas es “uno a muchos”, ya que cada artículo puede contener varios comentarios:

symfony_bdatos.jpg

Instalar el framework Symfony

Los únicos requisitos para instalar y trabajar con Symfony son los de disponer de un servidor web, cualquier versión de PHP 5 y una consola de comandos del sistema operativo. Cumplidos los requisitos anteriores, Symfony se puede instalar de varias formas.

Si sólo se quiere probar el framework lo más rápido posible, se puede utilizar el “sandbox”, que es un archivo comprimido que contiene todos los archivos del framework. Después de descargar el sandbox, se descomprime en la carpeta principal del servidor y ya se puede acceder al framework vía http://localhost/sf_sandbox.

Sin embargo, el método preferido de instalación de Symfony es mediante PEAR, ya que es tan sencillo como instalar el “sandbox”, funciona igual de bien en cualquier sistema operativo y se instala en menos de 1 minuto. Si se dispone de PEAR correctamente instalado, solamente es necesario ejecutar los siguientes comandos:

> pear channel-discover pear.symfony-project.com
> pear install symfony/symfony

Este método es el preferido por los programadores porque es el más fácil de actualizar y permite que todos los proyectos desarrollados con Symfony compartan la misma versión del framework. En el resto de código de este artículo, se supone que se ha instalado Symfony mediante PEAR.

Para los programadores más avanzados y los que quieran estar permanentemente actualizados, también se puede instalar Symfony mediante su repositorio de Subversion.

Proyecto, aplicación y módulo

Symfony divide los proyectos web en aplicaciones y módulos. En nuestro ejemplo, el proyecto se denomina blog. Dentro de un proyecto, se pueden definir diferentes aplicaciones, todas ellas compartiendo el mismo modelo de datos y un mismo nombre de dominio.

Todos los proyectos web habituales suelen estar formados por una parte pública a la que acceden los usuarios y una parte de administración con la que los responsables del sitio manejan su funcionamiento y gestionan sus contenidos.

La parte pública (llamada normalmente frontend, por su nombre en inglés) sería una aplicación del proyecto y la parte de administración (llamada normalmente backend) sería otra aplicación distinta dentro del mismo proyecto. En nuestro ejemplo, el proyecto blog incluye dos aplicaciones llamadas frontend y backend.

Además, cada aplicación se puede dividir en varios módulos. Cada módulo suele corresponderse con una tabla de la base de datos, aunque no es obligatorio que así sea. Las aplicaciones de nuestro proyecto están formadas por dos módulos cada una, llamados articulo y comentario.

symfony_ima2.jpg

Cuando ya se han decidido las aplicaciones y módulos que forman el proyecto, se crea su estructura básica de archivos y directorios. En primer lugar se crea un directorio para el proyecto y a continuación, se ejecutan los siguientes comandos de Symfony desde el interior de ese directorio:

> symfony new blog
> symfony app frontend
> symfony app backend

Dependiendo del sistema operativo y de la instalación realizada, puede ser necesario utilizar el prefijo php antes de cada comando Symfony (por ejemplo: > php symfony new blog). Además, todos los comandos Symfony se deben ejecutar siempre desde el directorio raíz del proyecto. Si se ejecuta el comando symfony sin argumentos, se muestra el listado completo de tareas disponibles.

Los comandos anteriores crean la siguiente estructura básica de archivos y directorios del proyecto blog y de sus dos aplicaciones:

apps/
  frontend/
  backend/
batch/
cache/
config/
data/
  sql/
doc/
lib/
  model/
log/
plugins/
test/
  unit/
  functional/
web/
  css/
  images/
  js/
  uploads/

La estructura de directorios creada por Symfony puede parecer excesiva, pero está completamente pensada para los proyectos web profesionales, de forma que el código de la aplicación se encuentre lo más ordenado y estructurado posible.

Symfony también permite cambiar el nombre y localización de todos los archivos del proyecto por si es necesario adaptarse a la estructura y normas de algún cliente en particular.

Base de datos y esquema

Una vez creada la estructura básica del proyecto, se definen las opciones de conexión con la base de datos y se crea el esquema que representa el modelo de datos del proyecto. Las opciones de conexión se definen en el archivo de configuración config/databases.yml, en el que se deben descomentar todas sus líneas eliminando el carácter # que se incluye por defecto al principio de cada línea:

all:
  propel:
    class:          sfPropelDatabase
    param:
      dsn:          mysql://root:contrasena@localhost/blog

Los archivos de configuración de Symfony utilizan el formato YAML, el preferido por todos los frameworks modernos, en vez del tradicional y más aburrido formato XML. No obstante, Symfony permite utilizar archivos XML o INI si es necesario.

La única opción que se debe modificar es el dsn que define las opciones de conexión con la base de datos. Symfony permite utilizar bases de datos de tipo SQLite, MySQL, PostgreSQL, Oracle y SQL Server. Cambiar de base de datos sólo requiere modificar la opción dsn, ya que el resto de la aplicación funciona igual de bien con cualquier sistema gestor de base de datos.

La palabra all significa que estas opciones de conexión se utilizan en todos los entornos de ejecución, como se verá más adelante. La palabra propel es el nombre que se le da a esta conexión con la base de datos. Propel también es el nombre de una herramienta externa incluida en Symfony.

Propel es un ORM, lo que significa que, gracias a Propel, se puede trabajar con una base de datos sin utilizar instrucciones SQL. Para crear, obtener, modificar o borrar datos de la base de datos, no es necesario escribir ni una sola sentencia SQL, ya que se puede trabajar directamente con objetos, como se verá más adelante.

Una vez definida la conexión con la base de datos, se crea en el archivo config/schema.yml el esquema de la base de datos que representa el modelo de datos del proyecto:

propel:
  blog_articulo:
    _attributes:   { phpName: Articulo }
    id:
    titulo:        varchar(255)
    contenido:     longvarchar
    created_at:
  blog_comentario:
    _attributes:   { phpName: Comentario }
    id:
    articulo_id:
    autor:         varchar(255)
    contenido:     longvarchar
    created_at:

El esquema define la estructura de tablas y columnas de la base de datos del proyecto. En este ejemplo, se definen dos tablas: blog_articulo y blog_comentario. Entre las numerosas opciones que puede definir cada tabla, se encuentra la opción phpName, que indica el nombre de la clase PHP utilizada para manejar cada tabla. Las columnas se definen mediante su nombre y el tipo de dato que almacena.

El tipo de dato no es obligatorio, ya que en algunos casos, Symfony es capaz de deducirlo a partir del nombre de la columna. Si por ejemplo una columna se llama id, salvo que se le indique lo contrario, Symfony supone que es la clave primaria de la tabla y, por tanto, que es de tipo entero, que no puede tomar valores null y que su valor se autoincrementa.

Si una columna se llama xxxxxx_id, Symfony supone que es una clave externa que hace referencia a la tabla xxxxxxx (se puede utilizar el valor indicado en el atributo phpName).

Otras columnas mágicas son created_at y updated_at. Si una columna se llama created_at, Symfony la considera de tipo “fecha y hora” y cada vez que se crea un registro en la tabla, Symfony se encarga de asignarle el valor correcto de forma automática. La columna updated_at también se considera de tipo “fecha y hora” y su valor se actualiza automáticamente cada vez que se modifica el registro de la base de datos.

El esquema definido es independiente del sistema gestor de base de datos, por lo que si en cualquier momento del desarrollo del proyecto se decide cambiar de MySQL a SQLite o de PostgreSQL a Oracle, sólo se deben modificar las opciones de conexión del archivo config/databases.yml.

Una vez definido el esquema, se ejecuta el comando symfony propel-build-model para generar (en el directorio lib/model) todas las clases PHP que se encargan de manejar la base de datos mediante objetos. Por otra parte, el comando symfony propel-build-sql genera (en el archivo data/sql/lib.model.schema.sql) el archivo SQL que permite crear la base de datos.

Si se utiliza MySQL como en este ejemplo, el archivo SQL generado tiene en cuenta la sintaxis particular de MySQL y se puede utilizar directamente para crear la base de datos mediante el comando:

mysql -u USUARIO_BASE_DATOS -p NOMBRE_BASE_DATOS < data/sql/lib.model.schema.sql

También es posible utilizar el comando symfony propel-build-all para generar de forma simultánea las clases del modelo y el archivo SQL. Los comandos anteriores se utilizan cuando no existía previamente la base de datos.

Si antes de empezar el proyecto Symfony ya dispones de una base de datos, puedes hacer el trabajo inverso: generar el esquema y las clases PHP a partir de una base de datos existente.

Configurar el servidor web

Una buena práctica cuando se desarrollan aplicaciones web consiste en crear un servidor virtual por cada proyecto. Symfony también recomienda lo mismo para cada proyecto.

De esta forma, se puede acceder a nuestro proyecto mediante una URL sencilla como http://blog, en vez de http://localhost/blog, http://localhost/sf_sandbox/blog o cualquier otra URL más larga.

Para crear el servidor virtual, se configura un nuevo VirtualHost en Apache (en las versiones más recientes de Apache, se configura en el archivo httpd-vhosts.conf):

<VirtualHost *:80>
  ServerName blog
  DocumentRoot "/home/proyectos/blog/web"
  DirectoryIndex index.php
  
  Alias /sf /php/pear/data/symfony/web/sf
  <Directory "/php/pear/data/symfony/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
  
  <Directory "/home/proyectos/blog/web">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

El valor de la directiva DocumentRoot es la ruta completa hasta el directorio web dentro del proyecto. El Alias definido es necesario para que se vean las imágenes, JavaScripts y CSS del propio framework (que se utilizan en el entorno de desarrollo) y debe contener la ruta completa hasta el directorio web/sf dentro del directorio en el que se ha instalado Symfony.

Antes de poder acceder al proyecto mediante la dirección http://blog, es necesario editar el archivo /etc/hosts (si utilizas Linux) o c:\WINDOWS\system32\drivers\etc\hosts (si utilizas Windows) para indicar que blog es un nombre que realmente hace referencia al propio ordenador de desarrollo:

127.0.0.1       localhost
127.0.0.1       blog

Si la configuración anterior se realiza correctamente, al acceder a la dirección http://blog se muestra la página de bienvenida por defecto de Symfony:

symfony_ima3.jpg

Entornos de ejecución

Las aplicaciones Symfony se pueden ejecutar en diferentes entornos, todos ellos compartiendo el mismo código PHP pero diferenciándose en la configuración utilizada. Cuando se crea una aplicación, Symfony crea por defecto tres entornos: producción (prod), pruebas (test) y desarrollo (dev). Además de estos entornos iniciales, se pueden crear todos los entornos adicionales que se consideren necesarios.

Lo que diferencia un entorno de otro son las opciones con las que se ejecuta la aplicación. En el entorno de desarrollo, Symfony registra en el archivo de log todos los mensajes que se producen y desactiva la caché, para que todos los cambios en la configuración de la aplicación tengan un efecto inmediato. En el entorno de producción, sólo se guardan en el archivo de log los mensajes de error y la caché se activa para mejorar el rendimiento de la aplicación.

La definición de varios entornos permite utilizar una base de datos cuando se desarrolla la aplicación y otra base de datos diferente cuando la aplicación se encuentra en el servidor de producción. En los archivos de configuración, todas las opciones que se indican bajo la palabra dev: tienen efecto en el entorno de desarrollo, las opciones bajo prod: se utilizan en el entorno de producción y las opciones bajo all: son utilizadas en todos los entornos en los que se ejecuta la aplicación.

Las aplicaciones Symfony utilizan un patrón de diseño conocido como “controlador frontal”, que consiste en utilizar un único punto de entrada a cada aplicación. Concretamente, todas las peticiones que realiza el usuario se controlan mediante un único script de PHP, que se encarga de redirigir las peticiones a cada módulo y acción correspondientes en cada caso.

Symfony crea en el directorio web del proyecto dos controladores frontales para cada nueva aplicación. El controlador frontal de desarrollo se denomina nombreAplicacion + _dev.php, por lo que en este ejemplo, Symfony crea los controladores frontend_dev.php y backend_dev.php. El controlador frontal de producción de la primera aplicación creada (en este ejemplo, la aplicación frontend) se denomina index.php y el del resto de aplicaciones se llaman igual que la aplicación (en este ejemplo, backend.php).

De esta forma, para acceder a la aplicación frontend en el entorno de producción, se utiliza la URL http://blog/index.php. Si Apache tiene habilitado el módulo mod_rewrite para reescribir las URL, se puede utilizar directamente http://blog.

Para acceder a la aplicación frontend en el entorno de desarrollo, se utiliza la URL http://blog/frontend_dev.php. De la misma forma, la aplicación backend se puede acceder en el entorno de producción (http://blog/backend.php) y en el de desarrollo (http://blog/backend_dev.php).

Cuando se accede a una aplicación en el entorno de desarrollo, cualquier cambio que se haya realizado en su configuración tiene efecto inmediato. Sin embargo, el entorno de producción utiliza la caché de configuración, por lo que debe borrarse esta caché cada vez que se quiera acceder en producción y que se tengan en cuenta los cambios realizados. Para borrar la caché, se utiliza el comando symfony cc.

Crear la parte de administración del blog

La programación de la parte de administración de una aplicación web es siempre la parte más aburrida del desarrollo. Además, en general, la administración de una aplicación consiste en realizar cuatro operaciones básicas sobre sus datos: crear, modificar, borrar y obtener registros de la base de datos.

Afortunadamente, Symfony dispone de las herramientas necesarias para crear una completa administración de forma automática. En pocos segundos y sin necesidad de escribir ni una sola línea de código, la aplicación puede disponer de una parte de administración con soporte de las cuatro operaciones básicas.

Utilizando el esquema de la base de datos definido anteriormente y ejecutando un par de comandos sencillos, Symfony genera todas las acciones y módulos encargados de la gestión de los datos. En concreto, los siguientes comandos crean la parte de administración de los artículos y de los comentarios:

> symfony propel-init-admin backend articulo Articulo
> symfony propel-init-admin backend comentario Comentario

Al comando propel-init-admin se le debe pasar el nombre de la aplicación (backend), el nombre que tendrá el módulo generado automáticamente (articulo) y el nombre de la clase PHP que se encarga de representar la tabla de datos (Articulo).

Después de ejecutar los comandos anteriores, ya se puede acceder a la parte de gestión de los artículos en la dirección http://blog/backend.php/articulo. Por defecto, el módulo muestra el listado de artículos disponibles en la base de datos. Como todavía no existe ningún artículo, se pulsa sobre el botón Create para crear varios artículos de prueba:

symfony_ima4.jpg

La parte de gestión de los comentarios es idéntica a la de los artículos, salvo que en este caso, el formulario de creación del comentario también muestra la clave externa que hace referencia a los artículos. Para mostrar la clave externa, Symfony utiliza el método mágico de PHP llamado __toString().

Si no se ha definido este método, se muestra directamente el valor numérico de id. Si se quiere mostrar el título del artículo en vez de su id, tan sólo se debe definir el método mágico __toString() en la clase del modelo de los artículos (en el archivo lib/model/Articulo.php):

class Articulo extends BaseArticulo
{
  public function __toString()
  {
    return self::getTitulo();
  }
}

Ahora, al mostrar o modificar los datos de un comentario, se muestra el título del artículo al que hace referencia:

symfony_ima5.jpg

El generador automático de administraciones permite modificar por completo sus características sin necesidad de escribir ni una sola línea de código. Cualquier característica que se quiera añadir, modificar o eliminar a la parte de administración se puede realizar simplemente añadiendo una opción de configuración en el archivo generator.yml que se encuentra en el directorio config de cada módulo generado automáticamente.

Las siguientes opciones modifican el listado de comentarios para incluir unos filtros o buscadores, para indicar que el máximo número de comentarios que se muestran en el listado debe ser 5 y que cada fila de datos sólo debe mostrar el autor y el contenido del comentario:

generator:
  class:              sfPropelAdminGenerator
  param:
    model_class:      Comentario
    theme:            default
    list:
      display:        [autor, contenido]
      filters:        [articulo_id, contenido, created_at]
      max_per_page:   5

Después de modificar esta configuración, no olvides utilizar el entorno de desarrollo (backend_dev.php) o borrar la caché de la configuración mediante el comando symfony cc. El resultado de la nueva configuración se muestra en la siguiente imagen:

symfony_ima6.jpg

Symfony se encarga de crear el filtro o buscador adecuado en función del tipo de dato de cada filtro (lista desplegable <select> para el articulo_id, <input> para contenido y calendarios para created_at). Además de estas opciones básicas, el generador de Symfony dispone literalmente de cientos de opciones, para poder personalizar la parte de administración generada automáticamente.

Configurando a medida la parte de administración y aplicándole una hoja de estilos CSS propia, es posible crear una completa parte de administración en pocos minutos y con la calidad suficiente como para satisfacer a cualquier cliente.

Conclusión

En esta primera parte del artículo, apenas se han esbozado algunas de las posibilidades del framework Symfony. No obstante, se ha podido comprobar cómo se puede crear toda la parte de administración de una aplicación web en pocos minutos.

Symfony permite olvidarse de las tareas aburridas y repetitivas para centrarse en el trabajo que realmente aporta valor a las aplicaciones. La segunda parte del artículo se centra en realizar algunas funcionalidades de la parte pública del blog.