Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guia Symfony
Guia Symfony
● Iniciando la aplicación
○ Módulos y Acciones
● Primeros pasos
○ Layout de la aplicación
2. Desarrollo
2.1. Instalación
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 queremos probar el framework lo más rápido posible, se puede utilizar el
“sandbox”, que es un archivo comprimido (se entrega en el cd del taller) que contiene
todos los archivos del framework. Este archivo 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. Lo primero que debemos hacer es instalar
PEAR, para ello ejecutamos:
En linux:
apt-get install php-pear
En Windows
go-pear.bat
Una vez que PEAR se encuentra correctamente instalado, solamente es necesario
ejecutar los siguientes comandos:
pear channel-discover pear.symfony-project.com
pear install symfony/symfony
Este ultimo 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. Para el desarrollo del taller, vamos a considerar tener
instalado el framework mediante PEAR.
Para el caso de que se instale en Windows, es recomendable agregar a la variable
de ambiente PATH la ruta donde instalamos PHP, dado que en ese mismo directorio
contaremos con el comando pear.bat y symfony.bat, siendo este ultimo necesario para
trabajar con nuestro proyecto Symfony.
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 lugar 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 Linux:
<VirtualHost *:80>
ServerName blog
DocumentRoot "/home/proyectos/blog/web"
DirectoryIndex index.php
<Directory "/home/proyectos/blog/web">
AllowOverride All
Allow from All
</Directory>
</VirtualHost>
En Windows:
<Directory "c:/wamp/php/pear/data/symfony/web/sf">
Allow from All
</Directory>
<VirtualHost *:80>
ServerName blog
DocumentRoot "c:/wamp/www/prueba/web"
DirectoryIndex index.php
Alias /sf "c:/wamp/php/pear/data/symfony/web/sf"
<Directory "c:/wamp/www/prueba/web">
AllowOverride All
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
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.
Los módulos de nuestro taller los iremos definiendo a medida que avancemos, pero
podemos considerar que vamos a tener al menos los siguientes: articulo y comentario.
Lo primero que debemos hacer es crear un directorio donde vamos a trabajar (el
indicado en el virtual host configurado en la sección de instalación) con nuestro proyecto,
luego inicializamos el proyecto, para eso ejecutamos desde una consola y parados en el
directorio antes creado:
symfony init-project blog
Luego, creamos nuestra aplicación frontend, para ello ejecutamos:
symfony init-app frontend
Aplicaciones de nuestro proyecto
Aplicación frontend
Módulos de la aplicación frontend
Acciones del modulo default
Templates (“vistas”) de las acciones
del modulo default
Templates (“vistas”) o Layout para la
aplicación frontend
Cache de archivos
Archivos de configuración para todo
el proyecto
Clases comunes a todo el proyecto
(inclusive modelo)
Directorio que sera para parte web de
nuestras aplicaciones: index.php, JS,
CSS, imagenes, etc.
Si todo esta correctamente configurado, al acceder a la dirección con nuestro
navegador:
http://blog
se muestra la página de bienvenida por defecto de Symfony:
2.3. Modelo de Datos
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.
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, que analizaremos 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.
También es necesario configurar el archivo config/propel.ini, que contiene
parámetros de configuración de Propel. En especial, solo vamos a configurar los
siguientes valores:
...........
propel.database = mysql
propel.database.createUrl = mysql://root:pass@localhost
propel.database.url = mysql://root:pass@localhost/blog
............
aquí le indicamos a Propel que tipo de base de datos utilizamos, cual es el dsn de la base
de datos, en caso de contar ya con la misma y cual es el dsn de donde debería crearla, en
caso de contar con el esquema y querer generarla a partir de este (a continuación
veremos los comandos para estos pasos).
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 veremos en el desarrollo del taller.
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 (en la carpeta de material para el taller de esta clase se puede
encontrar este archivo completo):
propel:
articulo:
_attributes: { phpName: Articulo }
id:
titulo: varchar(50)
contenido: longvarchar
usuario_id:
created_at:
comentario:
_attributes: { phpName: Comentario }
id:
articulo_id:
autor: varchar(255)
contenido: longvarchar
created_at:
.............
Clases que podemos modificar para
extender el modelo. Solo se generan
una vez. Extienden a las clases “Base”.
Las clases que representan el modelo, cuentan con los getters y setters para cada
columna, así como métodos que permiten:
● save() : salvar el objeto a la base de datos (nueva fila si el objeto es nuevo o
modificar si el objeto ya correspondía con una).
● isNew(): saber si el objeto es nuevo y aún no fue guardado.
● isModified(): saber si el objeto esta modificado.
● delete(): para borrar de la base de datos.
● etc.
Existe un conjunto de clases llamadas “Peer”, que contienen lógica para acceder a
la base de datos (salvar, borrar, seleccionar). Estas clases no se instancian sino que
contienen un conjunto de métodos estáticos, como por ejemplo:
● doSelect($criteria) : ejecutar un select sobre el la tabla a la que corresponde en
función del criterio que reciben como parámetro.
● doDelete($criteria): ejecutar un delete sobre la base en función del criterio que
reciben como parámetro.
● retrieveByPk($id): retorna el objeto correspondiente con clave $id.
● etc.
y un conjunto de constantes que representan las diferentes columnas de la tabla que
representas, por ejemplo:
● UsuarioPeer::USERNAME
● ArticuloPeer: TITULO
● etc.
Para ver un ejemplo, agreguemos a nuestra clase UsuarioPeer un método que nos
permite obtener un usuario dado el username o null si no existe. Para ello, agregamos el
siguiente método en el archivo UsuarioPeer.php:
public static function retrieveByUsername($us)
{
$c = new Criteria();
$c->add(UsuarioPeer::USERNAME,$us);
return UsuarioPeer::doSelectOne($c);
}
En el ejemplo, aparece la utilización de un objeto Criteria. Este, nos permite
escribir consultas a la base de datos, respetando un modelo de objetos y sin tener la
necesidad de escribir código SQL. A lo largo del taller vamos a ir viendo mas ejemplos del
mismo. También cuentan con un anexo en la carpeta material_adicional/documentos
del cd del taller (es recomendable tener leído este anexo para la clase 2).
2.4. 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. Por ejemplo, podemos configurar el
archivo config/databases.yml de la siguiente forma:
prod:
propel:
class: sfPropelDatabase
param:
dsn: mysql://user:pass@localhost/blog_prod
all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://root:pass@localhost/blog
en el cual, nuestra base de datos en producción es diferente a la base utilizada en
desarrollo (por defecto, indicada bajo la directiva all:).
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 lo que venimos creando al momento
del taller, Symfony creo el controlador frontend_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 (por
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
Para acceder a la aplicación frontend en el entorno de desarrollo, se utiliza la URL:
http://blog/frontend_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 crear-cache
o, la versión resumida
symfony cc
2.5. Primeros Pasos
Por ultimo, durante esta clase, analizaremos algunos archivos de configuración de
la aplicación y escribiremos nuestra primer acción que sera la pagina de bienvenida al
blog.
Los archivos de configuración de la aplicación se encuentran dentro de la carpeta
apps/frontend/config.
Como primer instancia analizaremos el archivo apps/frontend/config/view.yml.
En este se indican parámetros referentes a la vista de la aplicación, como pueden ser: el
titulo de la pagina, los archivos de estilo que se quieren incluir así como los de de
JavaScript y el Layout por defecto que tendrá la pagina de la aplicación.
Nota: Recordar que la vista final del resultado de una acción esta formado por el
template de la acción embebido en el layout de la aplicación:
metas:
title: Blog del taller de Symfony
robots: blog, symfony
description: Taller para aprender Symfony
keywords: log, symfony
language: es
javascripts: [ ]
has_layout: on
layout: layout
Para esto, haremos uso de “Partials”, una herramienta con la que cuenta Symfony y con
la cual podemos dividir nuestra vista en diferentes archivos de manera de poder
“modularizar” regiones de nuestra vista, haciendo estas regiones reusables y mas fáciles
de mantener. El nombre de los archivos “Partials” deben comenzar con un guión bajo (_).
Así, por ejemplo, vamos a crear los archivos: _header.php, _footer.php y _menu.php
dentro del directorio apps/frontend/templates:
<?php include_partial('global/menu');?>
<div id="content">
<?php echo $sf_data->getRaw('sf_content') ?>
</div>
<?php include_partial('global/footer');?>
Las funciones include_partial indican que se debe incluir un archivo partial (la
palabra clave global indican que los partials están en la carpeta templates de la
aplicación.
El llamado $sf_data->getRaw('sf_content') debe incluirse siempre ya que lo que
indica es que se debe imprimir el resultado de la acción que se esta llamando.
Ahora indicaremos cual es nuestro modulo y acción por defecto si no se indica otra,
para ello descomentaremos las siguientes lineas del archivo
apps/frontend/config/settings.yml:
all:
.actions:
default_module: default
default_action: index
#
# error_404_module: default
# error_404_action: error404
#
# login_module: default
# login_action: login
#
# secure_module: default
# secure_action: secure
con las demás lineas iremos trabajando en las próximas clases.
Luego, iremos al archivo
apps/frontend/modules/default/actions/action.class.php que contiene la lógica de las
diferentes acciones del modulo default y modificaremos la acción index de la siguiente
manera:
public function executeIndex()
{
$this->mensaje="Bievenidos al Blog del taller de Symfony";
return sfView::SUCCESS; //Valor por defecto.
}
En esta acción la variable $mensaje es salvada de manera de poder ser accesible desde
el template de la acción.
Nota: Recordar que todas las acciones en Symfony comienzan con la palabra “execute”
Nota: Recordar que los templates de las acciones se llaman como la acción, por ejemplo
index, seguido del resultado de la acción, por ejemplo Success. Por ejemplo, si la acción
retorna sfView::ERROR deberíamos tener un template que se llame indexError.php