11 mayo 2012

Instalando symfony 1.4 en Ubuntu

Symfony es un completo framework diseñado para optimizar, gracias a sus características, el desarrollo de las aplicaciones web. Para empezar, separa la lógica de negocio, la lógica de servidor y la presentación de la aplicación web.

Proporciona varias herramientas y clases encaminadas a reducir el tiempo de desarrollo de una aplicación web compleja. Además, automatiza las tareas más comunes, permitiendo al desarrollador dedicarse por completo a los aspectos específicos de cada aplicación. El resultado de todas estas ventajas es que no se debe reinventar la rueda cada vez que se crea una nueva aplicación web.

Inicialización del directorio del proyecto

Antes de instalar symfony, es necesario crear el directorio que contendrá todos los ficheros relacionados con el proyecto. Para el ejemplo que nos ocupa, dispondremos de un contenedor global de proyectos en /home/sfprojects/  y, en su interior, colocaremos una carpeta diferente para cada proyecto que vayamos a crear (en este tutorial, nuestro proyecto se llamará  proyecto):
$ sudo mkdir -p /home/sfprojects/proyecto
$ sudo chown -R username.username /home/sfproject/proyecto
$ cd /home/sfproject/proyecto
Elección de la versión de Symfony

En el momento de escribir este artículo, symfony tiene dos ramas estables del framework: la 1.4.17 y la 2.0.0. En este tutorial asumimos que se desea instalar symfony 1.4.

Se puede instalar symfony a nivel global en el servidor o incrustarlo en cada uno de los proyectos. Esta segunda opción es la preferida porque nos permitirá que los proyectos sean totalmente independientes unos de otros.

La actualización del framework instalado localmente en un proyecto no romperá ninguno de los otros proyectos de forma inesperada. Esto significa que se pueden tener proyectos en diferentes versiones de Symfony, y actualizarlos cada uno a la vez que mejor convenga.

Siguiendo la práctica recomendada, instalaremos los archivos de symfony en el directorio lib/vendor. Así pues, en primer lugar, vamos a crear ese directorio dentro de la estructura del proyecto:
$ mkdir -p lib/vendor
Instalando Symfony

La forma más fácil de instalar symfony es descargándose el archivo desde la página web oficial del proyecto. Tenemos disponibles para la descarga las versiones en formatos .tgz y .zip.

Descargamos el archivo (en nuestro caso, la versión .tgz) y lo colocamos en el directorio recién creado proyecto/lib/vendor, lo descomprimimos, y le cambiamos el nombre a symphony:
$ cd lib/vendor
$ wget http://www.symfony-project.org/get/symfony-1.4.17.tgz
$ tar zxpf symfony-1.4.17.tgz
$ mv symfony-1.4.17.tgz symfony
$ rm symfony-1.4.17.tgz
Creación del proyecto

Nos situamos en el directorio proyecto/ y, para crear el proyecto symfony, ejecutaremos la tarea generate:project:
$ cd ../..
$ php lib/vendor/symfony/data/bin/symfony generate:project proyecto
La tarea generate:project genera la estructura predeterminada de directorios y archivos necesarios para un proyecto symfony:
Directorio Descripción
apps/ Contiene todas las aplicaciones del proyecto
cache/ Los archivos almacenados en caché por el framework
config/ Los archivos de configuración del proyecto
data/ Los archivos de datos como los accesorios iniciales
lib/ Las bibliotecas y clases del proyecto
log/ Los archivos de registro del framework
plugins/ Los plugins instalados
test/ La unidad y los archivos de prueba funcional
web/ El directorio raíz web (véase más adelante)
¿Por qué Symfony genera tantos archivos?

Uno de los principales beneficios de usar un framework completo es la normalización de los desarrollos. Gracias a la estructura de archivos y directorios por defecto de Symfony, cualquier desarrollador con algunos conocimientos de Symfony puede asumir el mantenimiento de un proyecto. En cuestión de minutos, será capaz de bucear en el código, corregir errores y añadir nuevas funcionalidades.

La tarea generate:project también crea, en el directorio raíz del proyecto, un acceso directo hacia symfony  para acortar el número de caracteres a escribir cuando se ejecuta una tarea. Por lo tanto, a partir de ahora, en lugar de utilizar la ruta completa al programa de Symfony (proyecto/lib/vendor/symfony/data/bin/symfony), podemos utilizar el acceso directo de symfony.

Verificación de la instalación

Ahora que Symfony está instalado, desde el directorio proyecto/, comprobaremos que todo funciona correctamente. Para ello, utilizaremos la línea de comandos de symfony para que nos muestre la versión instalada (notar el uso de la V mayúscula):
$ php symfony -V
symfony version 1.4.17 (/home/sfprojects/proyecto/lib/vendor/symfony/lib)
La opción -V también muestra la ruta al directorio de instalación de Symfony, que se almacena en config/ProjectConfiguration.class.php. Si en el fichero de configuración muestra una ruta absoluta hacia Symfony (siguiendo las instrucciones al pie de la letra, no debería serlo), con el fin de obtener una mejor portabilidad, la cambiaremos por lo que se sigue:
// config/ProjectConfiguration.class.php
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
De este modo, podremos mover el directorio del proyecto a cualquier otra parte del servidor y seguirá funcionando igual.

Configurando la base de datos

Al crear un nuevo proyecto, se activa por defecto Doctrine. Configurar la base de datos utilizada por Doctrine es tan sencillo como llamar la tarea configure:database:
$ php symfony configure:database "mysql:host=localhost;dbname=dbname" dbuser dbpassword
Creación de la aplicación

Ahora vamos a crear el frontend de la aplicación ejecutando la tarea generate:app.
$ php symfony generate:app frontend
Debido a que el acceso directo a symfony es ejecutable, de ahora en adelante, se pueden reemplazar todas las apariciones de «php symfony» por «./symfony».

Basado en el nombre de la aplicación dada como argumento, la tarea generate:app crea la estructura de directorios predeterminada necesaria para la aplicación dentro del directorio apps/frontend/:
Directorio Descripción
config/ Los archivos de configuración de la aplicación
lib/ Las bibliotecas de aplicaciones y clases
modules/ El código de la aplicación (MVC)
templates/ Los archivos de plantillas globales
Seguridad

De forma predeterminada, la tarea generate:aplication fortifica nuestra aplicación para prevenirla de las dos vulnerabilidades más extendidas en la web: XSS y CSRF.

Para evitar ataques XSS, se ha activado el mecanismo de escape de caracteres, y para prevenir los ataques CSRF, se habilita la generación de tokens.

Por supuesto, se puede ajustar la configuración de estos parametros, mediante las opciones:

   --escaping-strategy: Activa o desactiva el mecanismo de escape de caracteres
   --csrf-secret: Permite tokens de sesión en los formularios

En caso de no saber nada acerca de XSS y CSRF, es recomendable que se tome un tiempo para aprender más de estas vulnerabilidades de seguridad.

Permisos de la estructura de directorios

Antes de intentar acceder a un proyecto de nueva creación, es necesario establecer los permisos de escritura en los directorios cache/ y log/ a los niveles apropiados, de modo que el servidor web pueda escribir en ellos:
$ chmod 777 cache/ log/
Configuración del servidor web

Una buena práctica es poner bajo el directorio raíz web únicamente los archivos que necesiten tener acceso desde el exterior mediante un navegador web, como las hojas de estilo, el código JavaScript y las imágenes. Por defecto, se recomienda almacenar estos archivos en el subdirectorio web/ del proyecto symfony.

Si echamos un vistazo a este directorio, nos encontraremos algunos subdirectorios (css/, images/, js/ y uploads/) y los archivos de los controladores del frontend (index.php y frontend_dev.php). Estos son los únicos archivos PHP que necesitan estar bajo el directorio raíz de la web. Todos los demás archivos se pueden ocultar al navegador, lo cual es una buena idea en cuanto a seguridad se refiere.

Configuración del apache

Ahora es el momento de cambiar la configuración de Apache para que el nuevo proyecto sea accesible a través de la web. Editaremos el fichero de configuración httpd.conf para añadirle la siguiente configuración:
# Debemos asegurarnos de que esta línea exista una sola vez en nuestra configuración
NameVirtualHost 127.0.0.1:8080

# Esta es la configuración de nuestro proyecto
Listen 127.0.0.1:8080

<VirtualHost 127.0.0.1:8080>
   DocumentRoot "/home/sfprojects/proyecto/web"
   DirectoryIndex index.php
   <Directory "/home/sfprojects/proyecto/web">
      AllowOverride All
      Allow from All
   </Directory>
   Alias /sf /home/sfprojects/proyecto/lib/vendor/symfony/data/web/sf
   <Directory "/home/sfprojects/proyecto/lib/vendor/symfony/data/web/sf">
      AllowOverride All
      Allow from All
   </Directory>
   ErrorLog "/var/log/apache2/proyecto-error_log"
   CustomLog "/var/log/apache2/proyecto-access_log" common
</VirtualHost>
El Alias /sf permite el acceso a las imágenes y los archivos JavaScript necesarios para mostrar adecuadamente las páginas symfony por defecto y, también, la barra de herramientas de depuración web.

La configuración indicada  hace que Apache escuche peticiones web por el puerto 8080 del servidor. De este modo, el sitio será accesible a través de la siguiente URL:
http://localhost:8080/
Se puede cambiar 8080 por cualquier otro número. En favor de los números de puerto superiores a 1024 como éste, hay que decir que no requieren de derechos de administrador.

Configuración de un nombre de dominio dedicado

Si somos administradores del equipo, lo mejor será configurar un VirtualHost en lugar de añadir un nuevo puerto cada vez que se inicia un proyecto.

Así pues, en vez de elegir un puerto y agregarle la correspondiente declaración Listen, elegiremos un nombre que identifique el proyecto (con el sufijo .localhost para distinguirlo de un dominio de Internet real) y añadimos una declaración ServerName:

# Esta es la configuración de nuestro proyecto
<VirtualHost *:80>
   ServerName proyecto.localhost
   DocumentRoot "/home/sfprojects/proyecto/web"
   DirectoryIndex index.php
   <Directory "/home/sfprojects/proyecto/web">
      AllowOverride All
      Allow from All
   </Directory>
   Alias /sf /home/sfprojects/proyecto/lib/vendor/symfony/data/web/sf
   <Directory "/home/sfprojects/proyecto/lib/vendor/symfony/data/web/sf">
      AllowOverride All
      Allow from All
   </Directory>
   ErrorLog "/var/log/apache2/proyecto-error_log"
   CustomLog "/var/log/apache2/proyecto-access_log" common
</VirtualHost>
Para poder utilizar este nombre de dominio (proyecto.localhost) tendremos que declararlo localmente en el fichero /etc/hosts añadiéndole la siguiente línea:
127.0.0.1    proyecto.localhost

Comprobando la nueva configuración

Reiniciamos Apache, y verificamos que tenemos acceso a la aplicación escribiendo en el navegador http://localhost:8080/index.php o http://proyecto.localhost/index.php (dependiendo de la configuración elegida en el apartado anterior). Si todo ha ido correctamente, visualizaremos una página como esta:

Si Apache tiene instalado el módulo mod_rewrite no es necesario escribir index.php en la URL. Esto es posible gracias a las reglas de reescritura configuradas en el fichero web/.htaccess.

Podemos acceder al entorno de desarrollo (en otro documento hablaremos de los entornos) de la aplicación escribiendo la siguiente URL en el navegador:
http://proyecto.localhost/frontend_dev.php
La barra de debug web debería mostrarse en la esquina superior derecha, incluidos los iconos. La prueba de que la configuración del alias sf/ es correcta.

En este punto, Symfony 1.4.17 ya está instalado y es completamente operativo.

0 comentarios: