Estamos empezando a crear nuestro propio y pequeño framework, pero queremos ir adelantando en el tema, ya que todavía vamos preparando la tercera parte de dicho tutorial que ya consta de dos partes (ver parte 1, ver parte 2). Así que comenzamos con este tutorial para la instalación de Symfony que además me servirá como cuaderno de bitácora para nuevas ocasiones. Ahora bien, debemos de tener claro, clarísimo, que tenemos que contar con un servidor web, en mi caso un Apache instalado en un Ubuntu Server 11.04, corriendo en él PHP y MySql. Si no disponemos de dichas herramientas, debemos instalarlas para que pueda volar nuestro symfony. (Ver como instalar servidor web). Además, hemos sabido gracias a un lector de este blog de la existencia de compatibilidad para trabajar con proyectos symfony desde el IDE de Netbeans. Así que indagaremos en esto y en la próxima actualización del blog, incluiremos información sobre como crear un proyecto con Netbeans en symfony. (Descargar Netbeans).
Bien, una vez tenemos todo lo anterior listo y preparado, vamos a centrarnos en lo más sencillo de todo… Descargarnos Symfony desde su página web. http://www.symfony-project.org/installation Una vez lo tenemos descargado, debemos crearnos la carpeta donde irá ubicada nuestra nueva aplicación web. Daré las directrices propias a nivel estándar para que todos podáis seguir el tutorial tranquilamente y sin problemas.
1.- Abrimos un terminal en nuestro servidor y tipeamos lo siguiente:
mkdir -p /home/proyectosf/nombre cd /home/proyectos/nombre
Donde nombre es el nombre del proyecto en cuestión. En mi caso será suenyos.
2.- Ahora debemos crear una carpeta que albergará los archivos de Symfony:
mkdir -p lib/vendor
3.- Ahora tenemos que mover el paquete tgz que contiene symfony a dicha carpeta para poder operar con él, descomprimirlo en ella y eliminar el comprimido, pues ya no nos hará falta:
cd lib/vendor tar zxpf symfony-1.4.0.tgz mv symfony-1.4.0 symfony rm symfony-1.4.0.tgz
4.- Lo siguiente que debemos hacer, es comprobar que symfony es compatible con nuestro sistema. Para ello ejecutamos la siguiente línea desde el terminal y de este modo testearemos las características de nuestro server y symfony. Si nos sale alguna advertencia deberemos solucionarlo, de normal debe de indicar que paquetes hacen falta. Los instalamos y listo.
cd ../.. php lib/vendor/symfony/data/bin/check_configuration.php
5.- Comprobamos los resultados:
******************************** * * * symfony requirements check * * * ******************************** php.ini used by PHP: /etc/php5/apache2/php.ini ** Mandatory requirements ** OK requires PHP >= 5.2.4 OK php.ini: requires zend.ze1_compatibility_mode set to off ** Optional checks ** OK PDO is installed OK PDO has some drivers installed: mysql OK PHP-XML module installed [[WARNING]] XSL module installed *** Install the XSL module (recommended for Propel) *** OK can use token_get_all() OK can use mb_strlen() OK can use iconv() OK can use utf8_decode() [[WARNING]] has a PHP accelerator *** Install a PHP accelerator like APC (highly recommended) *** OK php.ini: short_open_tag set to off OK php.ini: magic_quotes_gpc set to off OK php.ini: register_globals set to off OK php.ini: session.auto_start set to off
6.- Como vemos, nos puede salir un par de avisos que debemos instalar. Vamos a solucionarlos:
sudo apt-get install php5-xcache php5-xsl
7.- Volvemos a ejecutar el test de symfony para ver si todo está OK y es posible que nos encontremos con esto:
******************************** * * * symfony requirements check * * * ******************************** php.ini used by PHP: /etc/php5/cli/php.ini ** WARNING ** * The PHP CLI can use a different php.ini file * than the one used with your web server. * If this is the case, please launch this * utility from your web server. ** WARNING ** ** Mandatory requirements ** OK PHP version is at least 5.2.4 (5.3.5-1ubuntu7.2) ** Optional checks ** OK PDO is installed OK PDO has some drivers installed: mysql, sqlite, sqlite2 OK PHP-XML module is installed OK XSL module is installed OK The token_get_all() function is available OK The mb_strlen() function is available OK The iconv() function is available OK The utf8_decode() is available OK The posix_isatty() is available OK A PHP accelerator is installed [[WARNING]] php.ini has short_open_tag set to off: FAILED *** Set it to off in php.ini *** OK php.ini has magic_quotes_gpc set to off OK php.ini has register_globals set to off OK php.ini has session.auto_start set to off OK PHP version is not 5.2.9
8.- Nos dice que php.ini tiene un atributo con un valor no válido. Dicho atributo es short_open_tag nos dice que lo pongamos a Off así que eso haremos:
sudo gedit /etc/php5/cli/php.ini
Presionamos las teclas Ctrl+F que sirven para buscar en el fichero y buscamos short_open_tag. Una vez lo localicemos y comprobemos que no se trata de un comentario (cuidado que lo podemos encontrar en dos partes del documento, la primera de ellas es un comentario) y ponemos su valor a Off. Para ver si todo a ido OK volvemos a ejecutar el test:
php lib/vendor/symfony/data/bin/check_configuration.php
9.- Y debemos de encontrarnos con lo siguiente:
******************************** * * * symfony requirements check * * * ******************************** php.ini used by PHP: /etc/php5/cli/php.ini ** WARNING ** * The PHP CLI can use a different php.ini file * than the one used with your web server. * If this is the case, please launch this * utility from your web server. ** WARNING ** ** Mandatory requirements ** OK PHP version is at least 5.2.4 (5.3.5-1ubuntu7.2) ** Optional checks ** OK PDO is installed OK PDO has some drivers installed: mysql, sqlite, sqlite2 OK PHP-XML module is installed OK XSL module is installed OK The token_get_all() function is available OK The mb_strlen() function is available OK The iconv() function is available OK The utf8_decode() is available OK The posix_isatty() is available OK A PHP accelerator is installed OK php.ini has short_open_tag set to off OK php.ini has magic_quotes_gpc set to off OK php.ini has register_globals set to off OK php.ini has session.auto_start set to off OK PHP version is not 5.2.9
Con esto ya tenemos symfony configurado OK, aunque ahora es aconsejable que copiemos dicho archivo de test a la raíz del sitio y realicemos dicho test desde el navegador, así nos aseguramos que todo está correcto. Un error tonto no pillado a tiempo puede hacernos perder la cabeza en una chorrada que se podía haber solucionado en un principio. Así que lo dicho, copiamos dicho archivo a la raíz del sitio:
cp lib/vendor/symfony/data/bin/check_configuration.php /home/proyectos/nombre
10.- Antes de mirar el test en el navegador reiniciamos apache y después comprobamos la siguiente url: http://localhost/nombre/check_configuration.php Donde nombre es el nombre de tu proyecto. Y para reiniciar Apache2 tipeamos lo siguiente en la consola:
sudo /etc/init.d/apache2 restart
Debería de salir todo OK. Si es así no olvidéis eliminar la copia que hemos colocado en la raíz de nuestro sitio. Ya no nos hace falta y en la raíz del sitio puede suponer un problema de seguridad e integridad en nuestro servidor. Si habéis experimentado algún aviso debéis de tener en cuenta que quizás debáis modificar también el siguiente archivo php.ini: /etc/php5/apache2/php.ini Comprobar que dicho archivo está correcto, guardáis y reiniciáis apache como se explicaba anteriormente. Ahora podemos comprobar la versión de symfony instalada, de este modo veremos si todo anda OK:
php lib/vendor/symfony/data/bin/symfony -V
Nótese que la V es mayúscula. Y la consola debería respondernos algo como:
symfony version 1.4.12 (/home/proyectos/nombre/lib/vendor/symfony/lib)
Esto significa que por el momento todo está correcto y que nuestra versión es las 1.4.12 Además dicha línea de comando nos puede dar información referente a todas las tareas que puede realizar symfony desde una terminal si quitamos el parámetro -V podéis probarlo y veréis cuantas opciones pone a nuestra disposición symfony.
php lib/vendor/symfony/data/bin/symfony
Configurando nuestro proyecto en Symfony
Symfony entiende como proyecto, aquel conjunto de aplicaciones que utilizan el mismo modelo de datos. En nuestro caso, para el proyecto que vamos a realizar crearemos dos aplicaciones diferentes, un frontend y un backend. Ambas pertenecientes al mismo proyecto. Una nos servirá para mostrar los contenidos de nuestra web a los visitantes, clientes,… Y la segunda nos servirá para administrar los contenidos.
Creamos el proyecto
¿Pensabas que ya estaba creado? Pues no, tan solo hemos creado la carpeta raíz del mismo y copiado el framework donde corresponde, pero ahora symfony debe de crear dicho proyecto. Veamos como se hace y qué tareas realiza symfony para tal evento:
php lib/vendor/symfony/data/bin/symfony generate:project suenyos
Esto nos debe dar como resultado un listado de acciones tomadas por symfony para crear nuestro proyecto.
Como vemos en la primera imagen, tenemos un atajo a symfony que se ha creado junto con el proyecto. Así que a partir de ahora utilizaremos dicho atajo para acortar nuestras instrucciones por consola.
Creación de aplicaciones en Symfony
Como decíamos anteriormente, nuestro proyecto constará de dos aplicaciones, frontend y backend. Así que creamos la primera aplicación incluida en nuestro proyecto:
php symfony generate:app frontend
Y listo, ya tenemos toda la estructura de trabajo montada. Podemos echar un vistazo a apps/frontend y veremos como de nuevo nos ha creado todo un enjambre de directorios:
Escuadriñando Symfony
Los entornos
En Symfony existen cuatro entornos de trabajo:
- Entorno de desarrollo: Como su nombre indica, es el propio para el desarrollo de la web, añadir funciones, corregir errores,…
- Entorno de prueba: Este entorno se encarga de probar la aplicación de forma automática.
- Entorno staging: Lo utiliza el cliente, pone a prueba la integridad de la aplicación e informa de errores.
- Entorno de producción: Será el entorno preparado para el usuario final.
Configurando el servidor
Ahora toca algo más técnico, configurar nuestro Apache para tener nuestro servidor de pruebas funcionando ok. Tenemos que tener en cuenta una serie de políticas de protección de datos y de ficheros, puesto que si probamos ahora mismo acceder a nuestro localhost e intentar alcanzar esta URI http://localhost/nombre/config/databases.yml cambiando nombre por el nombre de tu proyecto, seguramente descarges el fichero con lo que ello conlleva: nombres de bases de datos utilizadas, nombres de usuarios, contraseñas,… En fin… Una vulnerabilidad terrible. Un gravísimo error. Basta con saber que una aplicación web está desarrollada en symfony para poder intentar descargar dicho fichero. Debemos protegernos ante esto, además de que es buena opción el configurar bien nuestro servidor de pruebas para acceder mediante un nombre de dominio más sencillo, en nuestro caso http://www.suenyos2.com/ Veamos como lo hacemos.
Hosts virtuales
Para hacer más completo el tutorial y hacerlo más atractivo ya que este tutorial llega a su fin (hasta la segunda parte), vamos a configurar un host virtual en nuestro Apache.
- Lo primero que debemos hacer es crear la siguiente línea en el fichero hostsde nuestro servidor:
sudo gedit /etc/hosts # Añadimos la siguiente línea al fichero hosts 127.0.0.1 www.nombre.com # Cambiamos nombre por lo que queramos en # nuestro caso www.suenyos2.com # Después guardamos y salimos
- Después editamos el fichero default:
# Nos dirigimos al directorio sites-available cd /etc/apache2/sites-available # Editamos las dos primeras líneas del fichero # default dejándolas como se muestra: sudo gdit default # Y colocamos lo siguiente NameVirtualHost *.:80 <VirtualHost *.:80> # Ahora creamos nuestro propio fichero sudo gedit /etc/apache2/sites-available/www.nombre.com # Y colocamos lo siguiente # Asegúrate de tener sólo una vez # esta línea en su configuración NameVirtualHost localhost # Esta es la configuración de Nombre [Suenyos.Com] Listen 127.0.0.1:8080 <VirtualHost *.:80> DocumentRoot "/home/proyectos/nombre/web" DirectoryIndex index.php <Directory "/home/proyectos/nombre/web"> AllowOverride All Allow from All </Directory> Alias /sf /home/proyectos/nombre/lib/vendor/symfony/data/web/sf <Directory "/home/proyectos/nombre/lib/vendor/symfony/data/web/sf"> AllowOverride All Allow from All </Directory> </VirtualHost>
- Habilitamos el nuevo host virtual:
cd /etc/apache2 sudo a2ensite www.nombre.com ls -al sites-enabled/ sudo /etc/init.d/apache2 force-reload
- Y listo, ahora podremos acceder a http://www.nombre.com En nuestro caso http://www.suenyos2.com/
- Cuando accedas a tu servidor correctamente desde una de las opciones anteriores (recuerda que también puedes hacerlo desde http://localhost/nombre/index.php) deberás de ver algo parecido a esto:
Ahora tenemos que comprobar que la configuración de nuestro alias /sf funciona correctamente. Dicho alias nos da acceso a las imágenes y a los scripts de javascript necesarios para la correcta visualización de una página en concreto. Además también carga la barra de debug o depuración web. Para ver si todo está OK, accedemos a nuestro servidor y cambiamos el /index.php por /frontend_dev.php más o menos sería así http://www.nombre.com/frontend_dev.php Y debemos visualizar la siguiente pantalla:
Muy bien, pues hasta aquí todo correcto. Espero que os halla salido todo sobre ruedas. Si no pues nada, siempre podéis preguntar y o bien yo con mi humilde aportación o cualquier otro usuario de la web, pondrá a vuestra disposición su sabiduría para ayudaros en vuestros primeros pasos con symfony.
Bonus Track (Control de Versiones)
Como bien he visto en algunos tutoriales de la red sobre symfony he creído oportuno incorporar dicha información para facilitarnos el trabajo el día de mañana. ¿Cómo? Pues utilizando versiones de nuestro programa, de este modo siempre podemos volver atrás si la liamos mucho, entre otras ventajas como:
- Trabajar con más confianza (por lo de volver a versiones anteriores)
- Volver a una versión anterior si algún cambio la lía demasiado y nos rompe la aplicación
- Permitir el desarrollo grupal, es decir, que varias personas puedan meter mano a la aplicación
- Tener acceso a todas las versiones sucesivas de nuestra aplicación
Para llevar a cabo dicho control de versiones, debemos tener instalado algún programa que gestione dicha tarea. En el mercado hay muchas, nosotros utilizaremos Subversion que es gratuita y de fácil instalación. Si no disponéis de ella, atentos, que os describimos como instalarlo:
sudo apt-get install subversion subversion-tools sudo apt-get install libapache2-svn
Después de instalarlo tenemos que configurar el repositorio dirigiéndonos a /etc/apache2/mods-enabled/dav_svn.conf editarlo y dejarlo como se muestra a continuación:
sudo gedit /etc/apache2/mods-enabled/dav_svn.conf # Y el fichero debe presentar esta forma: <Location /repSuenyos> # Uncomment this to enable the repository DAV svn # Set this to the path to your repository SVNPath /var/lib/svn/repoSuenyos # Alternatively, use SVNParentPath if you have multiple repositories under # under a single directory (/var/lib/svn/repo1, /var/lib/svn/repo2, ...). # You need either SVNPath and SVNParentPath, but not both. #SVNParentPath /var/lib/svn # Access control is done at 3 levels: (1) Apache authentication, via # any of several methods. A "Basic Auth" section is commented out # below. (2) Apache <Limit> and <LimitExcept>, also commented out # below. (3) mod_authz_svn is a svn-specific authorization module # which offers fine-grained read/write access control for paths # within a repository. (The first two layers are coarse-grained; you # can only enable/disable access to an entire repository.) Note that # mod_authz_svn is noticeably slower than the other two layers, so if # you don't need the fine-grained control, don't configure it. # Basic Authentication is repository-wide. It is not secure unless # you are using https. See the 'htpasswd' command to create and # manage the password file - and the documentation for the # 'auth_basic' and 'authn_file' modules, which you will need for this # (enable them with 'a2enmod'). AuthType Basic AuthName "Subversion Repository" AuthUserFile /etc/apache2/dav_svn.passwd # To enable authorization via mod_authz_svn #AuthzSVNAccessFile /etc/apache2/dav_svn.authz # The following three lines allow anonymous read, but make # committers authenticate themselves. It requires the 'authz_user' # module (enable it with 'a2enmod'). <LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept> </Location>
Lo siguiente sería crear un grupo de usuarios propios para utilizar dicha aplicación, en nuestro caso el grupo lo llamaremos svn:
sudo groupadd svn
Después debemos añadir usuarios a dicho grupo, yo añadiré al usuario alex:
sudo usermod -G subversion alex
A continuación debemos crearle una contraseña a dicho usuario:
sudo htpasswd -c /etc/apache2/dav_svn.passwd alex # Nos pedirá una contraseña # Repetiremos la contraseña # Listo, usuario y contraseña creadas en # el grupo svn correctamente
Ahora solo nos queda crear el repositiorio indicado anteriormente, y para ello utilizaremos la herramienta instalada con anterioridad:
sudo mkdir -p /var/liv/svn/repSuenyos sudo svnadmin create /var/lib/svn/repSuenyos
Debemos de otorgar permisos al grupo svn:
sudo chown -R www-data:svn /var/lib/svn/
También debemos crear la estructura básica con la que trabaja subversion:
sudo svn mkdir -message="Directorios base del subversion" \ file:///var/lib/svn/repSuenyos/trunk \ file:///var/lib/svn/repSuenyos/tags \ file:///var/lib/svn/repSuenyos/branches
Y ahora importamos el proyecto a nuestro servidor subversion:
svn import /home/www/nombre http://www.suenyos2.com/repSuenyos -m "Initial import"
Entonces nos aparecerá en consola todas las transacciones de toda nuestra aplicación. Si todo va correcto, tras todo el chorro de copias de ficheros y archivos nos deberá de aparecer:
Commit de la revisión 1.
Y ya estará listo para sentencia. Ahora podremos acceder a http://www.suenyos2.com:8080/repSuenyos/ para comprobar que todo ha ido correctamente. También podéis utilizar Bazaar en su defecto, o mejor todavía, para aquellos usuarios de Tortoise ahora podéis utilizar RabbitVCS con entorno gráfico y mucho más sencillo de utilizar que los clásicos. De todos modos, hasta aquí llegamos hoy compañeros. Espero que aprendáis tanto como yo.
para usar symfony recomiendo usar el IDE Netbeans que trae integrado este framework y lo hace mucho más facil de utilizar e intuitivo. incluye el menú symfony y desde ahi se pueden ejecutar las ordenes que se describen en este post.
Aham, tomo nota y seguro que el resto también. Actulizo el post con dicha información para que todos conozcamos las facilidades que ofrece el IDE de Netbeans con Symfony. Como decía, muchas gracias.
I am writing to let you understand of the fantastic encounter my wife’s child encountered using your blog. She came to understand numerous pieces, with the inclusion of what it’s like to possess a very effective giving mood to have others easily gain knowledge of specific multifaceted issues. You actually exceeded her desires. Thank you for giving those helpful, trusted, informative and even easy thoughts on that topic to Emily.