04 agosto 2012

Instalando symfony 1.4 en Mac OS X

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.

En su momento vimos como realizar la instalación de symfony para Ubuntu. Hoy vamos a ver como realizar la instalación para Mac OS X

Requisitos previos

Antes de iniciar todo el proceso, debemos asegurarnos de tener en marcha una arquitectura MAMP (Mac-Apache-Mysql-PHP) en nuestro equipo.

Nota: Si el sistema MAMP ya está instalado, se puede saltar directamente al proceso de instalación de symfony.

Existen herramientas como apachefriends ó MAMP que instalan todo lo necesario de una forma cómoda y sin complicaciones. En este tutorial, en cambio, vamos a aprovechar, las versiones de Apache y PHP que ya vienen instaladas en Mac OS X Lion e instalaremos manualmente mySQL.

Apache

A diferencia de lo que pasa en Windows, Mac OS ya trae instalado el servidor Apache. Simplemente hay que activarlo. Para ello iremos a las «Preferencias del sistema», seleccionaremos el icono «Compartir» y marcaremos la opción «Compartir Web». Una vez activado el servicio, podemos comprobar el funcionamiento del servidor Apache escribiendo http://localhost en la barra de direcciones del navegador. Se mostrará una página básica que nos indicará que funciona correctamente.

Por defecto, la raíz de los documentos de la página web (ficheros HTML, PHP, imágenes, etc.) se encuentra en el directorio /Library/Webserver/Documents.

PHP

Una vez activado Apache, para que éste pueda cargar el módulo PHP, bastará con editar el fichero de configuración del servicio /etc/apache2/httpd.conf y descomentar la línea donde se carga el múdulo de PHP (descomentar LoadModule php5_module)
$ sudo vim /etc/apache2/httpd.conf
## Descomentamos (eliminamos el # inicial) la siguiente línea:
LoadModule php5_module libexec/apache2/libphp5.so
A continuación, hacemos una copia del fichero de configuración por defecto del PHP y lo editamos:
$ sudo cp /etc/php.ini.default /etc/php.ini
$ sudo vim /etc/php.ini
## Cambiamos el tamaño máximo de subida de ficheros hasta 30M:
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 30M

## Fijamos la zona horaria correspondiente:
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Europe/Madrid"
Para que todos estos cambios tengan efecto, hay que reiniciar el servicio de Apache
$ sudo apachectl restart
Para comprobar el correcto funcionamiento del PHP dentro de Apache, crearemos una página en PHP con una llamada a phpinfo() en la raíz de la web y la visualizaremos en el navegador:
$ sudo vim /Library/WebServer/Documents/info.php
<?php phpinfo(); ?>
Cargando esta página en el navegador podremos comprobar el correcto funcionamiento de PHP:

mySQL

A diferencia de Apache y PHP que, como ya hemos visto, sí vienen con el sistema y solo hay que activarlos, mySQL no viene viene incorporado (Mac OS X Lion incluye el soporte a postgreSQL).

Para poder instalarlo, deberemos descargarlo desde Download MySQL Community Server. En nuestro caso, elegimos «Mac OS X ver. 10.6 (x86, 64-bit), DMG Archive». Para realizar la descarga, no es preciso registrarse, basta con hacer click en «No thanks, just start my download!».

Una vez abierto el paquete DMG que nos acabamos de descargar, tenemos un ventana como esta:
El orden de instalación:
  1. Mysql-5.5.15-osx10.6-x86_64.pkg
  2. MySQL.prefPane
  3. MySQLStartupItem.pkg
Tal y como ha quedado instalado el sistema, la contraseña de root para mySQL está en blanco, lo cual es un potencial agujero de seguridad. Para ello, habrá que proceder a cambiar la contraseña siguiendo las indicaciones de "Cambiar la contraseña root de mySQL".

Para trabajar desde la cónsola de una forma más eficaz, nos puede interesar añadir el directorio donde se encuentran los ejecutables de mySQL dentro de la variable PATH del sistema. Para ello, editaremos el archivo .bash_profile dentro de nuestra carpeta personal y añadiremos la siguiente línea:
$ vim ~/.bash_profile
export PATH="/usr/local/mysql/bin:$PATH"

Para terminar con la configuración de mySQL, vamos a crear el fichero my.conf. Copiaremos el fichero de ejemplo que viene con la instalación y luego lo editaremos:
$ sudo cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
$ sudo vim /etc/my.cnf
Dentro del apartado [client], añadiremos al usuario root, descomentaremos la línea de password (eliminando el primer carácter #) y le indicaremos la contraseña de root de mySQL. Más abajo, en la sección [mysqld] nos aseguraremos de que la localización del socket sea la misma que la indicada por la variable pdo_mysql.default_socket del archivo de configuración /etc/php.ini (en el caso de los Mac, suele ser /tmp/mysql.sock):
[client]
user = root
password        = nuestra_contraseña

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock

[...]

INSTALACIÓN DE SYMFONY

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 /Users/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 /Users/sfprojects/proyecto
$ sudo chown -R username /Users/sfproject/proyecto
$ cd /Users/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.18 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
$ curl http://www.symfony-project.org/get/symfony-1.4.18.tgz -o symfony-1.4.18.tgz
$ tar zxpf symfony-1.4.18.tgz
$ mv symfony-1.4.18.tgz symfony
$ rm symfony-1.4.18.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.18 (/Users/sfprojects/proyecto/lib/vendor/symfony/lib)
La opción -V (en mayúscula) 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
i18n/ Los archivos para la internacionalización y localizació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 asegurarse de que se han establecido de forma correcta los permisos de escritura para los directorios cache/ y log/, 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 /etc/apache2/httpd.conf para habilitar la carga de los VirtualHost.
## Descomentamos la línea que incluye la configuración de los Virtual hosts
Include /private/etc/apache2/extra/httpd-vhosts.conf
A continuación, editamos el fichero de definición de los Virtual Host:
$ sudo vim /etc/apache2/extra/httpd-vhosts.conf
# 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 "/Users/sfprojects/proyecto/web"
   DirectoryIndex index.php
   <Directory "/Users/sfprojects/proyecto/web">
      AllowOverride All
      Allow from All
   </Directory>
   Alias /sf /Users/sfprojects/proyecto/lib/vendor/symfony/data/web/sf
   <Directory "/Users/sfprojects/proyecto/lib/vendor/symfony/data/web/sf">
      AllowOverride All
      Allow from All
   </Directory>
   ErrorLog "/private/var/log/apache2/proyecto-error_log"
   CustomLog "/private/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.

Para que todos estos cambios sean efectivos, hay que reiniciar el servidor apache.
$ sudo apachectl restart
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 con 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 "/Users/sfprojects/proyecto/web"
   DirectoryIndex index.php
   <Directory "/Users/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 "/private/var/log/apache2/proyecto-error_log"
   CustomLog "/private/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 será necesario escribir index.php en la URL. Esto es posible gracias a las reglas de reescritura configuradas en el fichero web/.htaccess.

Se puede 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
Debería de mostrarse la barra de debug web en la esquina superior derecha, incluidos los iconos.

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

0 comentarios: