symfony guia definitiva

Upload: gimberg-alcon

Post on 16-Oct-2015

133 views

Category:

Documents


3 download

TRANSCRIPT

  • www.librosweb.es

    Symfony la gua definitiva

    Fabien Potencier, Franois Zaninotto

  • AVISO IMPORTANTE

    El contenido de este libro es provisional, ya que sus contenidos se siguen

    revisando y actualizando con frecuencia.

    En el sitio web www.librosweb.es siempre se encuentra disponible la versin

    ms reciente de los contenidos y de este archivo PDF.

  • Captulo 1. Introduccin a SymfonyQu puedes hacer con Symfony? Qu necesitas para utilizarlo? Este captulo responde a

    todas estas preguntas.

    1.1. Symfony en pocas palabras

    Un framework simplifica el desarrollo de una aplicacin mediante la automatizacin de

    algunos de los patrones utilizados para resolver las tareas comunes. Adems, un framework

    proporciona estructura al cdigo fuente, forzando al desarrollador a crear cdigo ms legible y

    ms fcil de mantener. Por ltimo, un framework facilita la programacin de aplicaciones, ya

    que encapsula operaciones complejas en instrucciones sencillas.

    Symfony es un completo framework diseado para optimizar, gracias a sus caractersticas, el

    desarrollo de las aplicaciones web. Para empezar, separa la lgica de negocio, la lgica de

    servidor y la presentacin de la aplicacin web. Proporciona varias herramientas y clases

    encaminadas a reducir el tiempo de desarrollo de una aplicacin web compleja. Adems,

    automatiza las tareas ms comunes, permitiendo al desarrollador dedicarse por completo a los

    aspectos especficos de cada aplicacin. El resultado de todas estas ventajas es que no se debe

    reinventar la rueda cada vez que se crea una nueva aplicacin web.

    Symfony est desarrollado completamente con PHP 5. Ha sido probado en numerosos

    proyectos reales y se utiliza en sitios web de comercio electrnico de primer nivel. Symfony es

    compatible con la mayora de gestores de bases de datos, como MySQL, PostgreSQL, Oracle y

    SQL Server de Microsoft. Se puede ejecutar tanto en plataformas *nix (Unix, Linux, etc.) como

    en plataformas Windows. A continuacin se muestran algunas de sus caractersticas.

    1.1.1. Caractersticas de Symfony

    Symfony se dise para que se ajustara a los siguientes requisitos:

    Fcil de instalar y configurar en la mayora de plataformas (y con la garanta de que

    funciona correctamente en los sistemas Windows y *nix estndares)

    Independiente del sistema gestor de bases de datos

    Symfony, la gua definitiva

    2 www.librosweb.es

  • Sencillo de usar en la mayora de casos, pero lo suficientemente flexible como para

    adaptarse a los casos ms complejos

    Basado en la premisa de convenir en vez de configurar, en la que el desarrollador solo

    debe configurar aquello que no es convencional

    Sigue la mayora de mejores prcticas y patrones de diseo para la web

    Preparado para aplicaciones empresariales y adaptable a las polticas y arquitecturas

    propias de cada empresa, adems de ser lo suficientemente estable como para

    desarrollar aplicaciones a largo plazo

    Cdigo fcil de leer que incluye comentarios de phpDocumentor y que permite un

    mantenimiento muy sencillo

    Fcil de extender, lo que permite su integracin con libreras desarrolladas por terceros

    1.1.1.1. Automatizacin de caractersticas de proyectos web

    Symfony automatiza la mayora de elementos comunes de los proyectos web, como por

    ejemplo:

    La capa de internacionalizacin que incluye Symfony permite la traduccin de los datos

    y de la interfaz, as como la adaptacin local de los contenidos.

    La capa de presentacin utiliza plantillas y layouts que pueden ser creados por

    diseadores HTML sin ningn tipo de conocimiento del framework. Los helpers

    incluidos permiten minimizar el cdigo utilizado en la presentacin, ya que encapsulan

    grandes bloques de cdigo en llamadas simples a funciones.

    Los formularios incluyen validacin automatizada y relleno automtico de datos

    (repopulation), lo que asegura la obtencin de datos correctos y mejora la experiencia

    de usuario.

    Los datos incluyen mecanismos de escape que permiten una mejor proteccin contra

    los ataques producidos por datos corruptos.

    La gestin de la cach reduce el ancho de banda utilizado y la carga del servidor.

    Captulo 1. Introduccin a Symfony

    www.librosweb.es 3

  • La autenticacin y la gestin de credenciales simplifican la creacin de secciones

    restringidas y la gestin de la seguridad de usuario.

    El sistema de enrutamiento y las URL limpias permiten considerar a las direcciones de

    las pginas como parte de la interfaz, adems de estar optimizadas para los buscadores.

    El soporte de e-mail incluido y la gestin de APIs permiten a las aplicaciones web

    interactuar ms all de los navegadores.

    Los listados son ms fciles de utilizar debido a la paginacin automatizada, el filtrado y

    la ordenacin de datos.

    Los plugins, las factoras (patrn de diseo Factory) y los mixin permiten realizar

    extensiones a medida de Symfony.

    Las interacciones con Ajax son muy fciles de implementar mediante los helpers que

    permiten encapsular los efectos JavaScript compatibles con todos los navegadores en

    una nica lnea de cdigo.

    1.1.1.2. Entorno de desarrollo y herramientas

    Symfony puede ser completamente personalizado para cumplir con los requisitos de las

    empresas que disponen de sus propias polticas y reglas para la gestin de proyectos y la

    programacin de aplicaciones. Por defecto incorpora varios entornos de desarrollo diferentes e

    incluye varias herramientas que permiten automatizar las tareas ms comunes de la ingeniera

    del software:

    Las herramientas que generan automticamente cdigo han sido diseadas para hacer

    prototipos de aplicaciones y para crear fcilmente la parte de gestin de las

    aplicaciones.

    El framework de desarrollo de pruebas unitarias y funcionales proporciona las

    herramientas ideales para el desarrollo basado en pruebas (test-driven development).

    La barra de depuracin web simplifica la depuracin de las aplicaciones, ya que

    muestra toda la informacin que los programadores necesitan sobre la pgina en la que

    estn trabajando.

    Symfony, la gua definitiva

    4 www.librosweb.es

  • La interfaz de lnea de comandos automatiza la instalacin de las aplicaciones entre

    servidores.

    Es posible realizar cambios en caliente de la configuracin (sin necesidad de reiniciar

    el servidor).

    El completo sistema de log permite a los administradores acceder hasta el ltimo

    detalle de las actividades que realiza la aplicacin.

    1.1.2. Quin ha desarrollado Symfony y por qu motivo?

    La primera versin de Symfony fue publicada en Octubre de 2005 por Fabien Potencier,

    fundador del proyecto y coautor de este libro. Fabien es el presidente de Sensio

    (http://www.sensio.com/), una empresa francesa de desarrollo de aplicaciones web conocida

    por sus innovaciones en este campo.

    En el ao 2003, Fabien realiz una investigacin sobre las herramientas de software libre

    disponibles para el desarrollo de aplicaciones web con PHP. Fabien lleg a la conclusin de que

    no exista ninguna herramienta con esas caractersticas. Despus del lanzamiento de la versin

    5 de PHP, decidi que las herramientas disponibles haban alcanzado un grado de madurez

    suficiente como para integrarlas en un framework completo. Fabien emple un ao entero para

    desarrollar el ncleo de Symfony, basando su trabajo en el framework Mojavi (que tambin era

    un framework que segua el funcionamiento MVC), en la herramienta Propel para el mapeo de

    objetos a bases de datos (conocido como ORM, de object-relational mapping) y en los

    helpers empleados por Ruby on Rails en sus plantillas.

    Fabien desarroll originalmente Symfony para utilizarlo en los proyectos de Sensio, ya que

    disponer de un framework efectivo es la mejor ayuda para el desarrollo eficiente y rpido de las

    aplicaciones. Adems, el desarrollo web se hace ms intuitivo y las aplicaciones resultantes son

    ms robustas y ms fciles de mantener. El framework se utiliz por primera vez en el

    desarrollo de un sitio de comercio electrnico para un vendedor de lencera y posteriormente se

    utiliz en otros proyectos.

    Despus de utilizar Symfony en algunos proyectos, Fabien decidi publicarlo bajo una licencia

    de software libre. Sus razones para liberar el proyecto fueron para donar su trabajo a la

    comunidad, aprovechar la respuesta de los usuarios, mostrar la experiencia de Sensio y porque

    considera que es divertido hacerlo.

    Captulo 1. Introduccin a Symfony

    www.librosweb.es 5

  • NOTA

    Por qu lo llamaron Symfony y no CualquierNombreFramework? Porque Fabien quera unanombre corto que tuviera una letra s (de Sensio) y una letra f (de framework), que fuera fcil derecordar y que no estuviera asociado a otra herramienta de desarrollo. Adems, no le gustan lasmaysculas. Symfony era muy parecido a lo que estaba buscando, aunque no es una palabracorrecta en el idioma ingls (la palabra correcta es symphony), y adems estaba libre como nombrede proyecto. La otra alternativa era baguette.

    Para que Symfony fuera un proyecto de software libre exitoso, deba tener una documentacin

    amplia y en ingls, para aumentar la incorporacin de usuarios al proyecto. Fabien pidi a su

    compaero de trabajo Franois Zaninotto, el otro coautor de este libro, que investigara el

    cdigo fuente del programa y escribiera un libro sobre Symfony. Aunque el proceso fue arduo,

    cuando el proyecto se lanz pblicamente, la documentacin era suficiente como para atraer a

    muchos desarrolladores. El resto es historia.

    1.1.3. La comunidad Symfony

    Nada mas lanzar el sitio web de Symfony (http://www.symfony-project.com/) muchos

    desarrolladores de todo el mundo se descargaron e instalaron el framework, comenzaron a leer

    la documentacin y construyeron sus primeras aplicaciones con Symfony, aumentando poco a

    poco la popularidad de Symfony.

    En ese momento, los frameworks para el desarrollo de aplicaciones web estaban en pleno

    apogeo, y era muy necesario disponer de un completo framework realizado con PHP. Symfony

    proporcionaba una solucin irresistible a esa carencia, debido a la calidad de su cdigo fuente y

    a la gran cantidad de documentacin disponible, dos ventajas muy importantes sobre otros

    frameworks disponibles. Los colaboradores aparecieron en seguida proponiendo parches y

    mejoras, detectando los errores de la documentacin y realizando otras tareas muy

    importantes.

    El repositorio pblico de cdigo fuente y el sistema de notificacin de errores y mejoras

    mediante tickets permite varias formas de contribuir al proyecto y todos los voluntarios son

    bienvenidos. Fabien continua siendo el mayor contribuidor de cdigo al repositorio y se

    encarga de garantizar la calidad del cdigo.

    Actualmente, el foro de Symfony, las listas de correo y el IRC ofrecen otras alternativas vlidas

    para el soporte del framework, con el que cada pregunta suele obtener una media de 4

    respuestas. Cada da nuevos usuarios instalan Symfony y el wiki y la seccin de fragmentos de

    Symfony, la gua definitiva

    6 www.librosweb.es

  • cdigo almacenan una gran cantidad de documentacin generada por los usuarios. Cada

    semana el nmero de aplicaciones conocidas desarrolladas con Symfony se incrementa en 5 y

    el aumento continua.

    La comunidad Symfony es el tercer pilar del framework y esperamos que tu tambin te unas a

    ella despus de leer este libro.

    1.1.4. Es adecuado Symfony para m?

    Independientemente de que seas un experto programador de PHP 5 o un principiante en el

    desarrollo de aplicaciones web, podrs utilizar Symfony de forma sencilla. El principal

    argumento para decidir si deberas o no utilizar Symfony es el tamao del proyecto.

    Si tu proyecto consiste en desarrollar un sitio web sencillo con 5 o 10 pginas diferentes, acceso

    simple a bases de datos y no es importante asegurar un gran rendimiento o una documentacin

    adecuada, deberas realizar tu proyecto solo con PHP. En ese caso, no vas a obtener grandes

    ventajas por utilizar un framework de desarrollo de aplicaciones web, adems de que utilizar

    objetos y el modelo MVC (Modelo Vista Controlador) solamente va a ralentizar el desarrollo de

    tu proyecto. Adems, Symfony no est optimizado para ejecutarse de forma eficiente en un

    servidor compartido en el que los scripts de PHP se ejecutan solamente mediante CGI

    (Common Gateway Interface).

    Por otra parte, si desarrollas aplicaciones web complejas con mucha lgica de negocio, no es

    recomendable utilizar solo PHP. Para asegurar el mantenimiento y las ampliaciones futuras de

    la aplicacin, es necesario que el cdigo sea ligero, legible y efectivo. Si quieres incorporar los

    ltimos avances en interaccin con usuarios (como por ejemplo Ajax), puedes acabar

    escribiendo cientos de lneas de JavaScript. Si quieres desarrollar aplicaciones de forma

    divertida y muy rpida, no es aconsejable utilizar solo PHP. En todos estos casos, deberas

    utilizar Symfony.

    Si eres un desarrollador web profesional, ya conoces todas las ventajas de utilizar un

    framework de desarrollo de aplicaciones web y solo necesitas un framework que sea maduro,

    bien documentado y con una gran comunidad que lo apoye. En este caso, deberas dejar de

    buscar porque Symfony es lo que necesitas.

    Captulo 1. Introduccin a Symfony

    www.librosweb.es 7

  • SUGERENCIA

    Si quieres ver una demostracin visual de las posibilidades de Symfony, deberas ver los vdeos oscreencasts que estn disponibles en el sitio web de Symfony. En estas demostraciones se ve lo rpidoy divertido que es desarrollar aplicaciones web con Symfony.

    1.2. Conceptos bsicos

    Antes de empezar con Symfony, deberas conocer algunos conceptos bsicos. Puedes saltarte

    esta seccin si conoces el significado de OOP, ORM, RAD, DRY, KISS, TDD, YAML y PEAR.

    1.2.1. PHP 5

    Symfony est programado en PHP 5 (http://www.php.net/) y est enfocado al desarrollo de

    aplicaciones web en el mismo lenguaje de programacin. Por este motivo, es obligatorio

    disponer de unos conocimientos avanzados de PHP 5 para sacar el mximo partido al

    framework.

    Los programadores que conocen PHP 4 pero que no han trabajado con PHP 5 deberan

    centrarse en el nuevo modelo orientado a objetos de PHP.

    1.2.2. Programacin Orientada a Objetos (OOP)

    La programacin orientada a objetos (OOP, por sus siglas en ingls Object-oriented

    programming) no va a ser explicada en este captulo, ya que se necesitara un libro entero para

    ello. Como Symfony hace un uso continuo de los mecanismos orientados a objetos disponibles

    en PHP 5, es un requisito obligatorio el conocer la OOP antes de aprender Symfony.

    En la Wikipedia se explica la OOP de la siguiente manera:

    La idea de la programacin orientada a objetos es que una aplicacin se puede

    considerar como una coleccin de unidades individuales, llamadas objetos, que

    interactan entre s. Los programas tradicionales pueden considerarse como una

    coleccin de funciones o como una lista de instrucciones de programacin.

    PHP 5 incluye los conceptos de clase, objeto, mtodo, herencia y muchos otros propios de la

    programacin orientada a objetos. Aquellos que no estn familiarizados con estos conceptos,

    Symfony, la gua definitiva

    8 www.librosweb.es

  • deberan consultar la documentacin oficial de PHP disponible en http://www.php.net/

    manual/es/language.oop5.basic.php.

    1.2.3. Mtodos mgicos

    Uno de los puntos fuertes de los objetos de PHP es la utilizacin de los mtodos mgicos.

    Este tipo de mtodos permiten redefinir el comportamiento de las clases sin modificar el

    cdigo externo. Con estos mtodos es posible que la sintaxis de PHP sea ms concisa y ms

    fcil de extender. Adems, estos mtodos son fciles de reconocer ya que sus nombres siempre

    empiezan con 2 guiones bajos seguidos (__).

    Por ejemplo, al mostrar un objeto, PHP busca de forma implcita un mtodo llamado

    __toString() en ese objeto y que permite comprobar si se ha creado una visualizacin

    personalizada para ese objeto:

    $miObjeto = new miClase();

    echo $miObjeto;

    // Se busca el mtodo mgico

    echo $miObjeto->__toString();

    Symfony utiliza los mtodos mgicos de PHP, por lo que deberas conocer su funcionamiento.

    La documentacin oficial de PHP tambin explica los mtodos mgicos (http://www.php.net/

    manual/es/language.oop5.magic.php)

    1.2.4. PEAR (PHP Extension and Application Repository)

    PEAR es un framework y sistema de distribucin para componentes PHP reutilizables.

    PEAR permite descargar, instalar, actualizar y desinstalar scripts de PHP. Si se utiliza un

    paquete de PEAR, no es necesario decidir donde guardar los scripts, cmo hacer que se puedan

    utilizar o cmo extender la lnea de comandos (CLI).

    PEAR es un proyecto creado por la comunidad de usuarios de PHP, est desarrollado con PHP

    y se incluye en las distribuciones estndar de PHP.

    SUGERENCIA

    El sitio web de PEAR, http://pear.php.net/, incluye documentacin y muchos paquetes agrupados

    en categoras.

    Captulo 1. Introduccin a Symfony

    www.librosweb.es 9

  • PEAR es el mtodo ms profesional para instalar libreras externas en PHP. Symfony aconseja

    el uso de PEAR para disponer de una instalacin nica y centralizada que pueda ser utilizada

    en varios proyectos. Los plugins de Symfony son paquetes de PEAR con una configuracin

    especial. El propio framework Symfony tambin est disponible como paquete de PEAR.

    Afortunadamente, no es necesario conocer la sintaxis de PEAR para utilizar Symfony. Lo nico

    necesario es entender su funcionamiento y tenerlo instalado. Para comprobar si PEAR est

    instalado en el sistema, se puede escribir lo siguiente en una lnea de comandos:

    > pear info pear

    El comando anterior muestra la versin de PEAR instalada en el sistema.

    El proyecto Symfony dispone de su propio repositorio PEAR, tambin llamado canal. Los

    canales de PEAR solamente se pueden utilizar a partir de la versin 1.4.0, por lo que es

    necesario actualizar PEAR si se dispone de una versin anterior. Para actualizar PEAR, se debe

    ejecutar el siguiente comando:

    > pear upgrade PEAR

    1.2.5. Mapeo de Objetos a Bases de datos (ORM)

    Las bases de datos siguen una estructura relacional. PHP 5 y Symfony por el contrario son

    orientados a objetos. Por este motivo, para acceder a la base de datos como si fuera orientada a

    objetos, es necesario una interfaz que traduzca la lgica de los objetos a la lgica relacional.

    Esta interfaz se denomina mapeo de objetos a bases de datos (ORM, de sus siglas en ingls

    object-relational mapping).

    Un ORM consiste en una serie de objetos que permiten acceder a los datos y que contienen en

    su interior cierta lgica de negocio.

    Una de las ventajas de utilizar estas capas de abstraccin de objetos/relacional es que evita

    utilizar una sintaxis especfica de un sistema de bases de datos concreto. Esta capa transforma

    automticamente las llamadas a los objetos en consultas SQL optimizadas para el sistema

    gestor de bases de datos que se est utilizando en cada momento.

    De esta forma, es muy sencillo cambiar a otro sistema de bases de datos completamente

    diferente en mitad del desarrollo de un proyecto. Estas tcnicas son tiles por ejemplo cuando

    se debe desarrollar un prototipo rpido de una aplicacin y el cliente aun no ha decidido el

    Symfony, la gua definitiva

    10 www.librosweb.es

  • sistema de bases de datos que ms le conviene. El prototipo se puede realizar utilizando SQLite

    y despus se puede cambiar fcilmente a MySQL, PostgreSQL u Oracle cuando el cliente se

    haya decidido. El cambio se puede realizar modificando solamente una lnea en un archivo de

    configuracin.

    La capa de abstraccin utilizada encapsula toda la lgica de los datos. El resto de la aplicacin

    no tiene que preocuparse por las consultas SQL y el cdigo SQL que se encarga del acceso a la

    base de datos es fcil de encontrar. Los desarrolladores especializados en la programacin con

    bases de datos pueden localizar fcilmente el cdigo.

    Utilizar objetos en vez de registros y clases en vez de tablas tiene otra ventaja: se pueden definir

    nuevos mtodos de acceso a las tablas. Por ejemplo, si se dispone de una tabla llamada Cliente

    con 2 campos, Nombre y Apellido, puede que sea necesario acceder directamente al nombre

    completo (NombreCompleto). Con la programacin orientada a objetos, este problema se resuelve

    aadiendo un nuevo mtodo de acceso a la clase Cliente de la siguiente forma:

    public function getNombreCompleto()

    {

    return $this->getNombre().' '.$this->getApellido();

    }

    Todas las funciones comunes de acceso a los datos y toda la lgica de negocio relacionada con

    los datos se puede mantener dentro de ese tipo de objetos. Por ejemplo, la siguiente clase

    CarritoCompra almacena los productos (que son objetos). Para obtener el precio total de los

    productos del carrito y as realizar el pago, se puede aadir un mtodo llamado getTotal() de la

    siguiente forma:

    public function getTotal()

    {

    $total = 0;

    foreach ($this->getProductos() as $producto)

    {

    $total += $producto->getPrecio() * $item->getCantidad();

    }

    return $total;

    }

    Captulo 1. Introduccin a Symfony

    www.librosweb.es 11

  • Y eso es todo. Imagina cuanto te hubiera costado escribir una consulta SQL que hiciera lo

    mismo.

    Propel, que tambin es un proyecto de software libre, es una de las mejores capas de

    abstraccin de objetos/relacional disponibles en PHP 5. Propel est completamente integrado

    en Symfony, por lo que la mayora de las manipulaciones de datos realizadas en este libro

    siguen la sintaxis de Propel. En el libro se describe la utilizacin de los objetos de Propel, pero

    se puede encontrar una referencia ms completa en el sitio web de Propel

    (http://propel.phpdb.org/trac/).

    1.2.6. Desarrollo rpido de aplicaciones (RAD)

    Durante mucho tiempo, la programacin de aplicaciones web fue un tarea tediosa y muy lenta.

    Siguiendo los ciclos habituales de la ingeniera del software (como los propuestos por el

    Proceso Racional Unificado o Rational Unified Process) el desarrollo de una aplicacin web no

    puede comenzar hasta que se han establecido por escrito una serie de requisitos, se han creado

    los diagramas UML (Unified Modeling Language) y se ha producido abundante

    documentacin sobre el proyecto. Este modelo se vea favorecido por la baja velocidad de

    desarrollo, la falta de versatilidad de los lenguajes de programacin (antes de ejecutar el

    programa se debe construir, compilar y reiniciar) y sobre todo por el hecho de que los clientes

    no estaban dispuestos a adaptarse a otras metodologas.

    Hoy en da, las empresas reaccionan ms rpidamente y los clientes cambian de opinin

    constantemente durante el desarrollo de los proyectos. De este modo, los equipos de desarrollo

    deben adaptarse a esas necesidades y tienen que poder cambiar la estructura de una aplicacin

    de forma rpida. Afortunadamente, el uso de lenguajes de script como Perl y PHP permiten

    seguir otras estrategias de programacin, como RAD (desarrollo rpido de aplicaciones) y el

    desarrollo gil de software.

    Una de las ideas centrales de esta metodologa es que el desarrollo empieza lo antes posible

    para que el cliente pueda revisar un prototipo que funciona y pueda indicar el camino a seguir.

    A partir de ah, la aplicacin se desarrolla de forma iterativa, en la que cada nueva versin

    incorpora nuevas funcionalidades y se desarrolla en un breve espacio de tiempo.

    Las consecuencias de estas metodologas para el desarrollador son numerosas. El programador

    no debe pensar acerca de las versiones futuras al incluir una nueva funcionalidad. Los mtodos

    Symfony, la gua definitiva

    12 www.librosweb.es

  • utilizados deben ser lo ms sencillos y directos posibles. Estas ideas se resumen en el principio

    denominado KISS: Haz las cosas sencillas, idiota! (Keep It Simple, Stupid)

    Cuando se modifican los requisitos o cuando se aade una nueva funcionalidad, normalmente

    se debe reescribir parte del cdigo existente. Este proceso se llama refactorizacin y sucede a

    menudo durante el desarrollo de una aplicacin web. El cdigo suele moverse a otros lugares

    en funcin de su naturaleza. Los bloques de cdigo repetidos se refactorizan en un nico lugar,

    aplicando el principio DRY: No te repitas (Dont Repeat Yourself).

    Para asegurar que la aplicacin sigue funcionando correctamente a pesar de los cambios

    constantes, se necesita una serie de pruebas unitarias que puedan ser automatizadas. Si estn

    bien escritas, las pruebas unitarias permiten asegurar que nada ha dejado de funcionar despus

    de haber refactorizado parte del cdigo de la aplicacin. Algunas metodologas de desarrollo de

    aplicaciones obligan a escribir las pruebas antes que el propio cdigo, lo que se conoce como

    TTD: desarrollo basado en pruebas (test-driven development).

    NOTA

    Existen otros principios y hbitos relacionados con el desarrollo gil de aplicaciones. Una de lasmetodologas ms efectivas se conoce como XP: programacin extrema (Extreme Programming). Ladocumentacin relacionada con XP puede ensearte mucho sobre el desarrollo rpido y efectivo delas aplicaciones. Una buena forma de empezar con XP son los libros escritos por Kent Beck en laeditorial Addison-Wesley.

    Symfony es la herramienta ideal para el RAD. De hecho, el framework ha sido desarrollado por

    una empresa que aplica el RAD a sus propios proyectos. Por este motivo, aprender a utilizar

    Symfony no es como aprender un nuevo lenguaje de programacin, sino que consite en

    aprender a tomar las decisiones correctas para desarrollar las aplicaciones de forma ms

    efectiva.

    El sitio web del proyecto Symfony incluye un tutorial en el que se explica paso a paso el

    desarrollo de una aplicacin utilizando las tcnicas de desarrollo gil de aplicaciones. La

    aplicacin se llama Askeet (http://www.symfony-project.com/askeet) y su lectura es muy

    recomendada para todos aquellos que quieran adentrarse en el desarrollo gil de aplicaciones.

    1.2.7. YAML

    Segn el sitio web oficial de YAML (http://www.yaml.org/), YAML es un formato para

    serializar datos que es fcil de procesar por las mquinas, fcil de leer para las personas y

    Captulo 1. Introduccin a Symfony

    www.librosweb.es 13

  • fcil de interactuar con los lenguajes de script. Dicho de otra forma, YAML es un lenguaje

    muy sencillo que permite describir los datos como en XML, pero con una sintaxis mucho ms

    sencilla. YAML es un formato especialmente til para describir datos que pueden ser

    transformados en arrays simples y asociativos, como por ejemplo:

    $casa = array(

    'familia' => array(

    'apellido' => 'Garca',

    'padres' => array('Antonio', 'Mara'),

    'hijos' => array('Jose', 'Manuel', 'Carmen')

    ),

    'direccion' => array(

    'numero' => 34,

    'calle' => 'Gran Va',

    'ciudad' => 'Cualquiera',

    'codigopostal' => '12345'

    )

    );

    Este array de PHP se puede crear directamente procesando esta cadena de texto en formato

    YAML:

    casa:

    familia:

    apellido: Garca

    padres:

    - Antonio

    - Mara

    hijos:

    - Jose

    - Manuel

    - Carmen

    direccion:

    numero: 34

    calle: Gran Va

    Symfony, la gua definitiva

    14 www.librosweb.es

  • ciudad: Cualquiera

    codigopostal: "12345"

    YAML utiliza la tabulacin para indicar su estructura, los elementos que forman una secuencia

    utilizan un guin medio y los pares clave/valor de los array asociativos se separan con 2

    puntos. YAML tambin dispone de una notacin resumida para describir la misma estructura

    con menos lneas: los arrays simples se definen con [] y los arrays asociativos se definen con {}.

    Por tanto, los datos YAML anteriores se pueden escribir de forma abreviada de la siguiente

    manera:

    casa:

    familia: { apellido: Garca, padres: [Antonio, Mara], hijos: [Jose, Manuel, Carmen] }

    direccion: { numero: 34, direccion: Gran Va, ciudad: Cualquiera, codigopostal: "12345" }

    YAML es el acrnimo de Yet Another Markup Language (Otro Lenguaje de Marcado) y se

    pronuncia yamel. El formato se lleva utilizando desde 2001 y existen utilidades para procesar

    YAML en una gran variedad de lenguajes de programacin.

    SUGERENCIA

    La especificacin completa del formato YAML se puede encontrar en http://www.yaml.org/.

    Como se ha visto, YAML es mucho ms rpido de escribir que XML (ya que no hacen falta las

    etiquetas de cierre y el uso continuo de las comillas) y es mucho ms poderoso que los

    tradicionales archivos .ini (ya que estos ltimos no soportan la herencia y las estructuras

    complejas). Por este motivo, Symfony utiliza el formato YAML como el lenguaje preferido para

    almacenar su configuracin. Este libro contiene muchos archivos YAML, pero como es tan

    sencillo, probablemente no necesites aprender ms detalles de este formato.

    1.3. Resumen

    Symfony es un framework para desarrollar aplicaciones web creado con PHP 5. Aade una

    nueva capa por encima de PHP y proporciona herramientas que simplifican el desarrollo de las

    aplicaciones web complejas. Este libro contiene todos los detalles del funcionamiento de

    Symfony y para entenderlo, solamente es necesario estar familiarizado con los conceptos

    bsicos de la programacin moderna, sobre todo la programacin orientada a objetos (OOP), el

    mapeo de objetos a bases de datos (ORM) y el desarrollo rpido de aplicaciones (RAD). El

    nico requisito tcnico obligatorio es el conocimiento de PHP 5.

    Captulo 1. Introduccin a Symfony

    www.librosweb.es 15

  • Captulo 2. Explorando el interior de

    SymfonyLa primera vez que se accede al cdigo fuente de una aplicacin realizada con Symfony, puede

    desanimar un poco a los nuevos desarrolladores. El cdigo est dividido en muchos directorios

    y muchos scripts y los archivos son un conjunto de clases PHP, cdigo HTML e incluso una

    mezcla de los dos. Adems, existen referencias a clases que no se pueden encontrar dentro del

    directorio del proyecto y la anidacin de directorios puede llegar hasta los 6 niveles. Sin

    embargo, cuando comprendas las razones que estn detrs de esta aparente complejidad, lo

    vers como algo completamente natural y no querrs cambiar la estructura de una aplicacin

    Symfony por ninguna otra. En este captulo se explica con detalle toda esa estructura.

    2.1. El patrn MVC

    Symfony est basado en un patrn clsico del diseo web conocido como arquitectura MVC,

    que est formado por 3 niveles:

    El modelo representa la informacin con la que trabaja la aplicacin, es decir, su lgica

    de negocio.

    La vista transforma el modelo en una pgina web que permite al usuario interactuar

    con ella.

    El controlador se encarga de procesar las interacciones del usuario y realiza los cambios

    apropiados en el modelo o en la vista.

    La Figura 2-1 ilustra el funcionamiento del patrn MVC.

    La arquitectura MVC separa la lgica de negocio (el modelo) y la presentacin (la vista) por lo

    que se consigue un mantenimiento ms sencillo de las aplicaciones. Por ejemplo, si una

    aplicacin debe ejecutarse tanto en un navegador estndar como un un navegador de un

    dispositivo mvil, solamente es necesario crear una vista nueva; manteniendo el controlador y

    el modelo original. El controlador se encarga de aislar al modelo y a la vista de los detalles del

    protocolo utilizado para las peticiones (HTTP, consola de comandos, email, etc.). El modelo se

    encarga de la abstraccin de la lgica relacionada con los datos, haciendo que la vista y las

    Symfony, la gua definitiva

    16 www.librosweb.es

  • acciones sean independientes de, por ejemplo, el tipo de gestor de bases de datos utilizados por

    la aplicacin.

    Figura 2.1. El patrn MVC

    2.1.1. Las capas de la arquitectura MVC

    Para poder entender las ventajas de utilizar el MVC, se va a transformar una aplicacin simple

    realizada con PHP en una aplicacin que sigue la arquitectura MVC. El ejemplo ideal para esta

    explicacin es el de mostrar una lista con las ltimas entradas de un blog.

    2.1.1.1. Programacin simple

    Utilizando solamente PHP normal y corriente, el script necesario para mostrar las entradas

    almacenadas en una base de datos se muestra en el siguiente listado:

    Listado 2-1 - Un script simple

  • $result = mysql_query('SELECT date, title FROM post', $link);

    ?>

    List of Posts

    List of Posts

    DateTitle

    El script anterior es fcil de escribir y rpido de ejecutar, pero muy difcil de mantener y

    actualizar. Los principales problemas del cdigo anterior son:

    Symfony, la gua definitiva

    18 www.librosweb.es

  • No existe proteccin frente a errores (qu ocurre si falla la conexin con la base de

    datos?).

    El cdigo HTML y el cdigo PHP estn mezclados en el mismo archivo e incluso en

    algunas partes estn entrelazados.

    El cdigo solo funciona si la base de datos es MySQL.

    2.1.1.2. Separando la presentacin

    Las llamadas a echo y printf del listado 2-1 dificultan la lectura del cdigo. De hecho, modificar

    el cdigo HTML del script para mejorar la presentacin es un folln debido a cmo est

    programado. As que el cdigo va a ser dividido en 2 partes. En primer lugar, el cdigo PHP

    puro con toda la lgica de negocio se incluye en el script del controlador, como se muestra en el

    listado 2-2.

    Listado 2-2 - La parte del controlador, en index.php

  • // Requiring the view

    require('view.php');

    ?>

    El cdigo HTML, que contiene cierto cdigo PHP a modo de plantilla, se almacena en el script

    de la vista, como se muestra en el listado 2-3.

    Listado 2-3 - La parte de la vista, en view.php

    List of Posts

    List of Posts

    DateTitle

    Una buena regla general para determinar si la parte de la vista est suficientemente limpia de

    cdigo es que debera contener una cantidad mnima de cdigo PHP, la suficiente como para

    que un diseador HTML sin conocimientos de PHP pueda entenderla. Las instrucciones ms

    comunes en la parte de la vista suelen ser echo, if/else, foreach/endforeach y poco ms.

    Adems, no se deben incluir instrucciones PHP que generen etiquetas HTML.

    Symfony, la gua definitiva

    20 www.librosweb.es

  • Toda la lgica se ha centralizado en el script del controlador, que solamente contiene cdigo

    PHP y ningn tipo de HTML. De hecho, y como puedes imaginar, el mismo controlador se

    puede reutilizar para otros tipos de presentaciones completamente diferentes, como por

    ejemplo un archivo PDF o una estructura de tipo XML.

    2.1.1.3. Separando la manipulacin de los datos

    La mayor parte del script del controlador se encarga de la manipulacin de los datos. Adems,

    qu ocurre si se necesita la lista de entradas del blog para otro controlador, por ejemplo uno

    que se dedica a generar el canal RSS de las entradas del blog? Y si se quieren centralizar todas

    las consultas a la base de datos en un nico sitio para evitar duplicidades? Qu ocurre si

    cambia el modelo de datos y la tabla entradas pasa a llamarse entradas_blog? Y si se quiere

    cambiar a PostgreSQL en vez de MySQL? Para poder hacer todo esto, es imprescindible

    eliminar del controlador todo el cdigo que se encarga de la manipulacin de los datos y

    ponerlo en otro script, llamado el modelo, tal y como se muestra en el listado 2-4.

    Listado 2-4 - La parte del modelo, en model.php

  • // Closing connection

    mysql_close($link);

    return $posts;

    }

    ?>

    El controlador modificado se puede ver en el listado 2-5.

    Listado 2-5 - La parte del controlador, modificada, en index.php

    Ahora el controlador es mucho ms fcil de leer. Su nica tarea es la de obtener los datos del

    modelo y pasrselos a la vista. En las aplicaciones ms complejas, el controlador se encarga de

    procesar las peticiones, las sesiones de los usuarios, la autenticacin, etc. El uso de nombres

    apropiados para las funciones del modelo hacen que sea innecesario aadir comentarios al

    cdigo del controlador.

    El script del modelo solamente se encarga del acceso a los datos y puede ser reorganizado a tal

    efecto. Todos los parmetros que no dependen de la capa de datos (como por ejemplo los

    parmetros de la peticin del usuario) se deben obtener a travs del controlador y por tanto, no

    se puede acceder a ellos directamente desde el modelo. Las funciones del modelo se pueden

    reutilizar fcilmente en otros controladores.

    Symfony, la gua definitiva

    22 www.librosweb.es

  • 2.1.2. Separacin en capas ms all del MVC

    El principio ms importante de la arquitectura MVC es la separacin del cdigo del programa

    en 3 capas, dependiendo de su naturaleza. La lgica relacionada con los datos se incluye en el

    modelo, el cdigo de la presentacin en la vista y la lgica de la aplicacin en el controlador.

    La programacin se puede simplificar si se utilizan otros patrones de diseo. De esta forma, las

    capas del modelo, la vista y el controlador se pueden subidividir en ms capas.

    2.1.2.1. Abstraccin de la base de datos

    La capa del modelo se puede dividir en la capa de acceso a los datos y en la capa de abstraccin

    de la base de datos. De esta forma, las funciones que acceden a los datos no utilizan sentencias

    ni consultas dependiente de una base de datos, sino que utilizan otras funciones para realizar

    las consultas. As, si se cambia de sistema gestor de bases de datos, solamente es necesario

    actualizar la capa de abstraccin de la base de datos.

    El listado 2-6 muestra una capa de acceso a datos dependiente de MySQL y el listado 2-7

    muestra una capa sencilla de abstraccin de la base de datos.

    Listado 2-6 - La parte del modelo correspondiente a la abstraccin de la base de

    datos

  • {mysql_select_db($database, $link);

    return mysql_query($query, $link);

    }

    function fetch_results($result)

    {

    return mysql_fetch_array($result, MYSQL_ASSOC);

    }

    Listado 2-7 - La parte del modelo correspondiente al acceso a los datos

    function getAllPosts()

    {

    // Connecting to database

    $link = open_connection('localhost', 'myuser', 'mypassword');

    // Performing SQL query

    $result = query_database('SELECT date, title FROM post', 'blog_db', $link);

    // Filling up the array

    $posts = array();

    while ($row = fetch_results($result))

    {

    $posts[] = $row;

    }

    // Closing connection

    close_connection($link);

    return $posts;

    }

    ?>

    Symfony, la gua definitiva

    24 www.librosweb.es

  • Como se puede comprobar, la capa de acceso a datos no contiene funciones dependientes de

    ningn sistema gestor de bases de datos, por lo que es independiente de la base de datos

    utilizada. Adems, las funciones creadas en la capa de abstraccin de la base de datos se

    pueden reutilizar en otras funciones del modelo que necesiten acceder a la base de datos.

    NOTA

    Los ejemplos de los listados 2-6 y 2-7 no son completos, y todava hace falta aadir algo de cdigopara tener una completa abstraccin de la base de datos (abstraer el cdigo SQL mediante unconstructor de consultas independiente de la base de datos, aadir todas las funciones a una clase,etc.) El propsito de este libro no es mostrar cmo se puede escribir todo ese cdigo, ya que en elcaptulo 8 se muestra cmo Symfony realiza de forma automtica toda la abstraccin.

    2.1.2.2. Los elementos de la vista

    La capa de la vista tambin puede aprovechar la separacin de cdigo. Las pginas web suelen

    contener elementos que se muestran de forma idntica a lo largo de toda la aplicacin:

    cabeceras de la pgina, el layout genrico, el pie de pgina y la navegacin global.

    Normalmente solo cambia el interior de la pgina. Por este motivo, la vista se separa en un

    layout y en una plantilla. Normalmente, el layout es global en toda la aplicacin o al menos en

    un grupo de pginas. La plantilla solo se encarga de visualizar las variables definidas en el

    controlador. Para que estos componentes interaccionen entre s correctamente, es necesario

    aadir cierto cdigo. Siguiendo estos principios, la parte de la vista del listado 2-3 se puede

    separar en 3 partes, como se muestra en los listados 2-8, 2-9 y 2-10.

    Listado 2-8 - La parte de la plantilla de la vista, en mytemplate.php

    List of Posts

    DateTitle

    Captulo 2. Explorando el interior de Symfony

    www.librosweb.es 25

  • Listado 2-9 - La parte de la lgica de la vista

    Listado 2-10 - La parte del layout de la vista

    2.1.2.3. Acciones y controlador frontal

    En el ejemplo anterior, el controlador no se encargaba de realizar muchas tareas, pero en las

    aplicaciones web reales el controlador suele tener mucho trabajo. Una parte importante de su

    trabajo es comn a todos los controladores de la aplicacin. Entre las tareas comunes se

    encuentra el manejo de las peticiones del usuario, el manejo de la seguridad, cargar la

    configuracin de la aplicacin y otras tareas similares. Por este motivo, el controlador

    normalmente se divide en un controlador frontal, que es nico para cada aplicacin, y las

    acciones, que incluyen el cdigo especfico del controlador de cada pgina.

    Una de las principales ventajas de utilizar un controlador frontal es que ofrece un punto de

    entrada nico para toda la aplicacin. As, en caso de que sea necesario impedir el acceso a la

    aplicacin, solamente es necesario editar el script correspondiente al controlador frontal. Si la

    aplicacin no dispone de controlador frontal, se debera modificar cada uno de los

    controladores.

    Symfony, la gua definitiva

    26 www.librosweb.es

  • 2.1.2.4. Orientacin a objetos

    Los ejemplos anteriores utilizan la programacin procedimental. Las posibilidades que ofrecen

    los lenguajes de programacin modernos para trabajar con objetos permiten simplificar la

    programacin, ya que los objetos pueden encapsular la lgica, pueden heredar mtodos y

    atributos entre diferentes objetos y proporcionan una serie de convenciones claras sobre la

    forma de nombrar a los objetos.

    La implementacin de una arquitectura MVC en un lenguaje de programacin que no est

    orientado a objetos puede encontrarse con problemas de namespaces y cdigo duplicado,

    dificultando la lectura del cdigo de la aplicacin.

    La orientacin a objetos permite a los desarrolladores trabajar con objetos de la vista, objetos

    del controlador y clases del modelo, transformando las funciones de los ejemplos anteriores en

    mtodos. Se trata de un requisito obligatorio para las arquitecturas de tipo MVC.

    SUGERENCIA

    Si quieres profundizar en el tema de los patrones de diseo para las aplicaciones web en el contextode la orientacin a objetos, puedes leer Patterns of Enterprise Application Architecture de MartinFowler (Addison-Wesley, ISBN: 0-32112-742-0). El cdigo de ejemplo del libro de Fowler est escritoen Java y en C#, pero es bastante fcil de leer para los programadores de PHP.

    2.1.3. La implementacin del MVC que realiza Symfony

    Piensa por un momento cuantos componentes necesitas para realizar una pgina sencilla que

    muestre un listado de las entrada de un blog. Como se muestra en la figura 2-2, son necesarios

    los siguientes componentes:

    La capa del Modelo

    Abstraccin de la base de datos

    Acceso a los datos

    La capa de la Vista

    Vista

    Plantilla

    Captulo 2. Explorando el interior de Symfony

    www.librosweb.es 27

  • Layout

    La capa del Controlador

    Controlador frontal

    Accin

    En total son siete scripts, por lo que son muchos archivos para abrir y modificar cada vez que se

    crea una pgina. Afortunadamente, Symfony simplifica este proceso. Symfony toma lo mejor de

    la arquitectura MVC y la implementa de forma que el desarrollo de aplicaciones sea rpido y

    sencillo.

    En primer lugar, el controlador frontal y el layout son comunes para todas las acciones de la

    aplicacin. Se pueden tener varios controladores y varios layouts, pero solamente es obligatorio

    tener 1 de cada. El controlador frontal es un componente que solo tiene cdigo relativo al MVC,

    por lo que no es necesario crear uno, ya que Symfony lo genera de forma automtica.

    La otra buena noticia es que las clases de la capa del modelo tambin se generan

    automticamente, en funcin de la estructura de datos de la aplicacin. La librera Propel se

    encarga de esta generacin automtica, ya que crea el esqueleto o estructura bsica de las clases

    y genera automticamente el cdigo necesario. Cuando Propel encuentra restricciones de

    claves forneas (o externas) o cuando encuentra datos de tipo fecha, crea mtodos especiales

    para acceder y modificar esos datos, por lo que la manipulacin de datos se convierte en un

    juego de nios. La abstraccin de la base de datos es completamente invisible al programador,

    ya que la realiza otro componente especfico llamado Creole. As, si se cambia el sistema gestor

    de bases de datos en cualquier momento, no se debe reescribir ni una lnea de cdigo, ya que

    tan solo es necesario modificar un parmetro en un archivo de configuracin.

    Por ltimo, la lgica de la vista se puede transformar en un archivo de configuracin sencillo,

    sin necesidad de programarla.

    Symfony, la gua definitiva

    28 www.librosweb.es

  • Figura 2.2. El flujo de trabajo de Symfony

    Considerando todo lo anterior, el ejemplo de la pgina que muestra un listado con todas las

    entradas del blog solamente requiere de 3 archivos en Symfony, que se muestran en los listados

    2-11, 2-12 y 2-13.

    Listado 2-11 - Accin list, en myproject/apps/myapp/modules/weblog/actions/

    actions.class.php

    Captulo 2. Explorando el interior de Symfony

    www.librosweb.es 29

  • Listado 2-12 - Plantilla list, en myproject/apps/myapp/modules/weblog/templates/

    listSuccess.php

    List of Posts

    DateTitle

    Listado 2-13 - Vista list, en myproject/apps/myapp/modules/weblog/config/view.yml

    listSuccess:

    metas: { title: List of Posts }

    Tambin es necesario definir el layout, como el del listado 2-14, pero el mismo layout se puede

    reutilizar muchas veces.

    Listado 2-14 - Layout, en myproject/apps/myapp/templates/layout.php

    Estos scripts son todo lo que necesita la aplicacin del ejemplo. El cdigo mostrado es el

    necesario para mostrar la misma pgina que generaba el script simple del listado 2-1. Symfony

    se encarga del resto de tareas, como hacer que los componentes interactuen entre s. Si se

    Symfony, la gua definitiva

    30 www.librosweb.es

  • considera el nmero de lneas de cdigo, el listado de entradas de blog creado segn la

    arquitectura MVC no requiere ms lneas ni ms tiempo de programacin que un script simple.

    Sin embargo, la arquitectura MVC proporciona grandes ventajas, como la organizacin del

    cdigo, la reutilizacin, la flexibilidad y una programacin mucho ms entretenida. Por si fuera

    poco, crear la aplicacin con Symfony permite crear pginas XHTML vlidas, depurar las

    aplicaciones, crear una configuracin sencilla, abstraccin de la base de datos utilizada,

    enrutamiento con URL limpias, varios entornos de desarrollo y muchas otras utilidades para el

    desarrollo de aplicaciones.

    2.1.4. Las clases que forman el ncleo de Symfony

    La implementacin que realiza Symfony de la arquitectura MVC incluye varias clases que se

    mencionan una y otra vez a lo largo del libro:

    sfController es la clase del controlador. Se encarga de decodificar la peticin y

    transferirla a la accin correspondiente.

    sfRequest almacena todos los elementos que forman la peticin (parmetros, cookies,

    cabeceras, etc.)

    sfResponse contiene las cabeceras de la respuesta y los contenidos. El contenido de este

    objeto se transforma en la respuesta HTML que se enva al usuario.

    El singleton de contexto (que se obtiene mediante sfContext::getInstance()) almacena

    una referencia a todos los objetos que forman el ncleo de Symfony y puede ser

    accedido desde cualquier punto de la aplicacin.

    El captulo 6 explica en detalle todos estos objetos.

    Como se ha visto, todas las clases de Symfony utilizan el prefijo sf, como tambin hacen todas

    las variables principales de Symfony en las plantillas. De esta forma, se evitan las colisiones en

    los nombres de clases y variables de Symfony y los nombres de tus propias clases y variables,

    adems de que las clases del framework son ms fciles de reconocer.

    NOTA

    Entre las normas seguidas por el cdigo de Symfony, se encuentra el estndar UpperCamelCasepara el nombre de las clases y variables. Solamente existen dos excepciones: las clases del ncleo de

    Captulo 2. Explorando el interior de Symfony

    www.librosweb.es 31

  • Symfony empiezan por sf (por tanto en minsculas) y las variables utilizadas en las plantillas que

    utilizan la sintaxis de separar las palabras con guiones bajos.

    Nota del traductor La notacin CamelCase consiste en escribir frases o palabras compuestaseliminando los espacios y poniendo en mayscula la primera letra de cada palabra. La varianteUpperCamelCase tambin pone en mayscula la primera letra de todas.

    2.2. Organizacin del cdigo

    Ahora que ya conoces los componentes que forman una aplicacin de Symfony, a lo mejor te

    ests preguntando sobre cmo estn organizados. Symfony organiza el cdigo fuente en una

    estructura de tipo proyecto y almacena los archivos del proyecto en una estructura

    estandarizada de tipo rbol.

    2.2.1. Estructura del proyecto: Aplicaciones, Mdulos y Acciones

    Symfony considera un proyecto como un conjunto de servicios y operaciones disponibles bajo

    un determinado nombre de dominio y que comparten el mismo modelo de objetos.

    Dentro de un proyecto, las operaciones se agrupan de forma lgica en aplicaciones.

    Normalmente, una aplicacin se ejecuta de forma independiente respecto de otras aplicaciones

    del mismo proyecto. Lo habitual es que un proyecto contenga dos aplicaciones: una para la

    parte pblica y otra para la parte de gestin, compartiendo ambas la misma base de datos.

    Tambin es posible definir proyectos que estn formados por varios sitios web pequeos, cada

    uno de ellos considerado como una aplicacin. En este caso, es importante tener en cuenta que

    los enlaces entre aplicaciones se deben indicar de forma absoluta.

    Cada aplicacin est formada por uno o ms mdulos. Un mdulo normalmente representa a

    una pgina web o a un grupo de pginas con un propsito relacionado. Por ejemplo, una

    aplicacin podra tener mdulos como home, articulos, ayuda, carritoCompra, cuenta, etc.

    Los mdulos almacenan las acciones, que representan cada una de las operaciones que se

    puede realizar en un mdulo. Por ejemplo el mdulo carritoCompra puede definir acciones

    como anadir, mostrar y actualizar. Normalmente las acciones se describen mediante verbos.

    Trabajar con acciones se muy similar a trabajar con las pginas de una aplicacin web

    tradicional, aunque en este caso dos acciones diferentes pueden acabar mostrando la misma

    Symfony, la gua definitiva

    32 www.librosweb.es

  • pgina (como por ejemplo la accin de aadir un comentario a una entrada de un blog, que

    acaba volviendo a mostrar la pgina de la entrada con el nuevo comentario).

    NOTA

    Nota del traductor En el prrafo anterior, la accin del carrito se llama anadir y no aadir, ya que el

    nombre debe utilizarse como nombre de fichero y como nombre de funcin, por lo que serecomienda utilizar exclusivamente caracteres ASCII, y por tanto, no debera utilizarse la letra .

    SUGERENCIA

    Si crees que todo esto es demasiado complicado para tu primer proyecto con Symfony, puedesagrupar todas las acciones en un nico mdulo, para simplificar la estructura de archivos. Cuando laaplicacin se complique, puedes reorganizar las acciones en diferentes mdulos. Como se comentaen el captulo 1, la accin de reescribir el cdigo para mejorar su estructura o hacerlo ms sencillo(manteniendo siempre su comportamiento original) se llama refactorizacin, y es algo muy comncuando se aplican los principios del RAD.

    La figura 2-3 muestra un ejemplo de organizacin del cdigo para un proyecto de un blog,

    siguiendo la estructura de proyecto / aplicacin / mdulo / accin. No obstante, la estructura

    de directorios real del proyecto es diferente al esquema mostrado por esa figura.

    Figura 2.3. Ejemplo de organizacin del cdigo

    2.2.2. Estructura del rbol de archivos

    Normalmente, los proyectos web comparten el mismo tipo de contenidos, como por ejemplo:

    Una base de datos, como MySQL o PostgreSQL

    Captulo 2. Explorando el interior de Symfony

    www.librosweb.es 33

  • Archivo estticos (HTML, imgenes, archivos de JavaScript, hojas de estilos, etc.)

    Archivos subidos al sitio web por parte de los usuarios o los administradores

    Clases y libreras PHP

    Libreras externas (scripts desarrollados por terceros)

    Archivos que se ejecutan por lotes (batch files) que normalmente son scripts que se

    ejecutan va lnea de comandos o mediante cron

    Archivos de log (las trazas que generan las aplicaciones y/o el servidor)

    Archivos de configuracin

    Symfony proporciona una estructura en forma de rbol de archivos para organizar de forma

    lgica todos esos contenidos, adems de ser consistente con la arquitectura MVC utilizada y

    con la agrupacin proyecto / aplicacin / mdulo. Cada vez que se crea un nuevo proyecto,

    aplicacin o mdulo, se genera de forma automtica la parte correspondiente de esa estructura.

    Adems, la estructura se puede personalizar completamente, para reorganizar los archivos y

    directorios o para cumplir con las exigencias de un cliente.

    2.2.2.1. Estructura de la raz del proyecto

    La raz de cualquier proyecto Symfony contiene los siguientes directorios:

    apps/

    frontend/

    backend/

    batch/

    cache/

    config/

    data/

    sql/

    doc/

    lib/

    model/

    log/

    Symfony, la gua definitiva

    34 www.librosweb.es

  • plugins/

    test/

    unit/

    functional/

    web/

    css/

    images/

    js/

    uploads/

    La tabla 2-1 describe los contenidos de estos directorios

    Tabla 2-1. Directorios en la raz de los proyectos Symfony

    Directorio Descripcin

    apps/Contiene un directorio por cada aplicacin del proyecto (normalmente, frontend

    y backend para la parte pblica y la parte de gestin respectivamente)

    batch/

    Contiene los scripts de PHP que se ejecutan mediante la lnea de comandos omediante la programacin de tareas para realizar procesos en lotes (batchprocesses)

    cache/

    Contiene la versin cacheada de la configuracin y (si est activada) la versincacheada de las acciones y plantillas del proyecto. El mecanismo de cache (quese explica en el Captulo 12) utiliza los archivos de este directorio para acelerar larespuesta a las peticiones web. Cada aplicacin contiene un subdirectorio queguarda todos los archivos PHP y HTML preprocesados

    config/ Almacena la configuracin general del proyecto

    data/

    En este directorio se almacenan los archivos relacionados con los datos, comopor ejemplo el esquema de una base de datos, el archivo que contiene lasinstrucciones SQL para crear las tablas e incluso un archivo de bases de datos deSQLite

    doc/Contiene la documentacin del proyecto, formada por tus propios documentos ypor la documentacin generada por PHPdoc

    Captulo 2. Explorando el interior de Symfony

    www.librosweb.es 35

  • lib/

    Almacena las clases y libreras externas. Se suele guardar todo el cdigo comn atodas las aplicaciones del proyecto. El subdirectorio model/ guarda el modelo de

    objetos del proyecto (como se describe en el Captulo 8)

    log/

    Guarda todos los archivos de log generados por Symfony. Tambin se puedeutilizar para guardar los logs del servidor web, de la base de datos o de cualquierotro componente del proyecto. Symfony crea un archivo de log por cadaaplicacin y por cada entorno (los archivos de log se ven detalladamente en elCaptulo 16)

    plugins/Almacena los plugins instalados en la aplicacin (el Captulo 17 aborda el temade los plugins)

    test/

    Contiene las pruebas unitarias y funcionales escritas en PHP y compatibles con elframework de pruebas de Symfony (que se explica en el captulo 15). Cuando secrea un proyecto, Symfony crea algunos pruebas bsicas

    web/La raz del servidor web. Los nicos archivos accesibles desde Internet son losque se encuentran en este directorio

    2.2.2.2. Estructura de cada aplicacin

    Todas las aplicaciones de Symfony tienen la misma estructura de archivos y directorios:

    apps/

    [nombre aplicacion]/

    config/

    i18n/

    lib/

    modules/

    templates/

    layout.php

    error.php

    error.txt

    La tabla 2-2 describe los subdirectorios de una aplicacin

    Tabla 2-2. Subdirectorios de cada aplicacin Symfony

    Symfony, la gua definitiva

    36 www.librosweb.es

  • Directorio Descripcin

    config/

    Contiene un montn de archivos de configuracin creados con YAML. Aqu sealmacena la mayor parte de la configuracin de la aplicacin, salvo losparmetros propios del framework. Tambin es posible redefinir en estedirectorio los parmetros por defecto si es necesario. El Captulo 5 contiene msdetalles sobre la configuracin de las aplicaciones

    i18n/

    Contiene todos los archivos utilizados para la internacionalizacin de laaplicacin, sobre todo los archivos que traducen la interfaz (el Captulo 13 detallala internacionalizacin). La internacionalizacin tambin se puede realizar conuna base de datos, en cuyo caso este directorio no se utilizara

    lib/ Contiene las clases y libreras utilizadas esclusivamente por la aplicacin

    modules/ Almacena los mdulos que definen las caractersticas de la aplicacin

    templates/

    Contiene las plantillas globales de la aplicacin, es decir, las que utilizan todos losmdulos. Por defecto contiene un archivo llamado layout.php, que es el layout

    principal con el que se muestran las plantillas de los mdulos

    NOTA

    En las aplicaciones recin creadas, los directorios i18n/, lib/ y modules/ estn vacos.

    Las clases de una aplicacin no pueden acceder a los mtodos o atributos de otras aplicaciones

    del mismo proyecto. Adems, los enlaces entre 2 aplicaciones de un mismo proyecto se deben

    indicar de forma absoluta. Esta ltima restriccin es importante durante la inicializacin del

    proyecto, que es cuando debes elegir como dividir el proyecto en aplicaciones.

    2.2.2.3. Estructura de cada mdulo

    Cada aplicacin contiene uno o ms mdulos. Cada mdulo tiene su propio subdirectorio

    dentro del directorio modules y el nombre del directorio es el que se elige durante la creacin del

    mdulo.

    Esta es la estructura de directorios tpica de un mdulo:

    apps/

    [nombre aplicacion]/

    Captulo 2. Explorando el interior de Symfony

    www.librosweb.es 37

  • modules/

    [nombre modulo]/

    actions/

    actions.class.php

    config/

    lib/

    templates/

    indexSuccess.php

    validate/

    La tabla 2-3 describe los subirectorios de un mdulo.

    Tabla 2-3. Subdirectorios de cada mdulo

    Directorio Descripcin

    actions/

    Normalmente contiene un nico archivo llamado actions.class.php y que se

    corresponde la clase que almacena todas las acciones del mdulo. Tambin esposible crear un archivo diferente para cada accin del mdulo

    config/Puede contener archivos de configuracin adicionales con parmetros exclusivosdel mdulo

    lib/ Almacena las clases y libreras utilizadas esclusivamente por el mdulo

    templates/Contiene las plantillas correspondientes a las acciones del mdulo. Cuando secrea un mdulo, se crea automticamente la plantilla indexSuccess.php

    validate/Contiene archivos de configuracin relacionados con la validacin de formularios(que se ver en el Captulo 10)

    NOTA

    En los mdulos recin creados, los directorios config/, lib/ y validate/ estn vacos.

    2.2.2.4. Estructura del sitio web

    Existen pocas restricciones sobre la estructura del directorio web, que es el directorio que

    contiene los archivos que se pueden acceder de forma pblica. Si se utilizan algunas

    Symfony, la gua definitiva

    38 www.librosweb.es

  • convenciones en los nombres de los subdirectorios, se pueden simplificar las plantillas. La

    siguiente es una estructura tpica del directorio web:

    web/

    css/

    images/

    js/

    uploads/

    Normalmente, los archivos estticos se organizan segn los directorios de la tabla 2-4.

    Tabla 2-4. Subdirectorios habituales en la carpeta web

    Directorio Descripcin

    css/Contiene los archivos de hojas de estilo creados con CSS (archivos con extensin.css

    images/ Contiene las imgenes del sitio con formato .jpg, .png o .gif

    js/ Contiene los archivos de JavaScript con extensin .js

    uploads/

    Se almacenan los archivos subidos por los usuarios. Aunque normalmente estedirectorio contiene imgenes, no se debe confundir con el directorio quealmacena las imgenes del sitio (images/). Esta distincin permite sincronizar los

    servidores de desarrollo y de produccin sin afectar a las imgenes subidas porlos usuarios

    NOTA

    Aunque es muy recomendable mantener la estructura definida por defecto, es posible modificarlapara adaptarse a las necesidades especficas de cada proyecto, como por ejemplo los proyectos quese ejecutan en servidores con sus propias estructuras de directorios definidas y con otras polticaspara el desarrollo de las aplicaciones. El Captulo 19 explica en detalle cmo modificar la estructura dedirectorios definida por Symfony.

    2.3. Herramientas comunes

    Algunas tcnicas se utilizan una y otra vez en Symfony, por lo que es fcil encontrarse con ellas

    a lo largo de este libro y en el desarrollo de tus proyectos. Entre estas tcnicas se encuentran los

    Captulo 2. Explorando el interior de Symfony

    www.librosweb.es 39

  • contenedores de parmetros (parameter holders), las constantes y la carga automtica de

    clases.

    2.3.1. Contenedores de parmetros

    Muchas de las clases de Symfony contienen algn contenedor de parmetros. Se trata de una

    forma eficiente de encapsular los atributos y as poder utilizar mtodos getter y setter sencillos.

    La clase sfResponse por ejemplo incluye un contenedor de parmetros que se puede obtener

    mediante el mtodo getParameterHolder(). Todos los contenedores de parmetros almacenan

    sus datos de la misma forma, como se muestra en el listado 2-15.

    Listado 2-15 - Uso del contenedor de parmetros de sfResponse

    $response->getParameterHolder()->set('parametro', 'valor');

    echo $response->getParameterHolder()->get('parametro');

    => 'valor'

    La mayora de clases que contienen contenedores de parmetros proporcionan mtodos

    abreviados para las operaciones de tipo get/set. La clase sfResponse es una de esas clases, ya

    que el cdigo abreviado del listado 2-16 obtiene el mismo resultado que el cdigo original del

    listado 2-15.

    Listado 2-16 - Uso de los mtodos abreviados del contenedor de parmetros de

    sfResponse

    $response->setParameter('parametro', 'valor');

    echo $response->getParameter('parametro');

    => 'valor'

    El mtodo getter del contenedor de parmetros permite la definicin de un segundo parmetro

    que actua de valor por defecto. De esta manera, se obtiene una proteccin frente a errores

    efectiva y sencilla. El listado 2-17 contiene un ejemplo de su uso.

    Listado 2-17 - Uso de valores por defecto en las funciones de tipo getter

    // El parmetro llamado 'parametro' no est definido, por lo que el getter devuelve un

    valor vaco

    echo $response->getParameter('parametro');

    Symfony, la gua definitiva

    40 www.librosweb.es

  • => null

    // El valor por defecto se puede obtener con sentencias condicionales

    if ($response->hasParameter('parametro'))

    {

    echo $response->getParameter('parametro');

    }

    else

    {

    echo 'valor_por_defecto';

    }

    => 'valor_por_defecto'

    // El siguiente mtodo es mucho ms rpido

    echo $response->getParameter('parametro', 'valor_por_defecto');

    => 'valor_por_defecto'

    Los contenedores de parmetros permiten la utilizacin de namespaces. Si se utiliza un tercer

    parmetro en un getter o en un setter, ese parmetro se utiliza como namespace del parmetro

    y por tanto, el parmetro solo estar definido dentro de ese namespace. El listado 2-18 muestra

    un ejemplo.

    Listado 2-18 - Uso de un namespace en el contenedor de parmetros de sfResponse

    $response->setParameter('parametro', 'valor1');

    $response->setParameter('parametro', 'valor2', 'mi/namespace');

    echo $response->getParameter('parametro');

    => 'valor1'

    echo $response->getParameter('parametro', null, 'mi/namespace');

    => 'valor2'

    Tambin es posible aadir contenedores de parmetros a tus propias clases, para aprovechar

    las ventajas de su sintaxis. El listado 2-19 muestra un ejemplo de cmo definir una clase con un

    contenedor de parmetros.

    Listado 2-19 - Aadir un contenedor de parmetros a una clase

    Captulo 2. Explorando el interior de Symfony

    www.librosweb.es 41

  • class MiClase

    {

    protected $contenedor_parametros = null;

    public function initialize ($parametros = array())

    {

    $this->contenedor_parametros = new sfParameterHolder();

    $this->contenedor_parametros->add($parametros);

    }

    public function getContenedorParametros()

    {

    return $this->contenedor_parametros;

    }

    }

    2.3.2. Constantes

    Aunque pueda parecer sorprendente, Symfony no define casi ninguna constante. La razn es

    que las constantes tienen un inconveniente en PHP: no se puede modificar su valor una vez

    definidas. Por este motivo, Symfony utiliza su propio objeto para almacenar la configuracin,

    llamado sfConfig, y que reemplaza a las constantes. Este objeto proporciona mtodos estticos

    para poder acceder a los parmetros desde cualquier punto de la aplicacin. El listado 2-20

    muestra el uso de los mtodos de la clase sfConfig.

    Listado 2-20 - Uso de los mtodos de la clase sfConfig en vez de constantes

    // En vez de constantes de PHP,

    define('SF_CONSTANTE', 'valor');

    echo SF_CONSTANTE;

    // Symfony utiliza el objeto sfConfig

    sfConfig::set('sf_constante', 'valor');

    echo sfConfig::get('sf_constante');

    Symfony, la gua definitiva

    42 www.librosweb.es

  • Los mtodos de sfConfig permiten definir valores por defecto y se puede invocar el mtodo

    sfConfig::set() ms de una vez sobre el mismo parmetro para modificar su valor. El captulo

    5 detalla el uso de los mtodos de sfConfig.

    2.3.3. Carga automtica de clases

    Normalmente, cuando se utiliza un mtodo de una clase o cuando se crea un objeto en PHP, se

    debe incluir antes la definicin de esa clase.

    include 'clases/MiClase.php';

    $miObjeto = new MiClase();

    Sin embargo, en los proyectos complejos con muchas clases y una estructura de directorios con

    muchos niveles, requiere mucho trabajo incluir todas las clases necesarias indicando

    correctamente la ruta de cada clase. Symfony utiliza la funcin __autoload() (o la funcin

    spl_autoload_register()) para evitar la necesidad de include y as poder escribir directamente:

    $miObjeto = new MiClase();

    En este caso, Symfony busca la definicin de la clase MiClase en todos los archivos con

    extensin .php que se encuentran en alguno de los directorios lib/ del proyecto. Si se encuentra

    la definicin de la clase, se incluye de forma automtica.

    De esta forma, si se guardan todas las clases en los directorios lib/, no es necesario incluir las

    clases de forma explcita. Por este motivo, los proyectos de Symfony no suelen incluir

    instrucciones de tipo include o require.

    NOTA

    Para mejorar el rendimiento, la carga automtica de clases de Symfony busca durante la primerapeticin en una serie de directorios (que se definen en un archivo interno de configuracin). Una vezrealizada la bsqueda en los directorios, se guarda el nombre de todas las clases encontradas y suruta de acceso en un array asociativo de PHP. As, las siguientes peticiones no tienen que volver amirar todos los directorios en busca de las clases. Este comportamiento implica que se debe borrar lacache de Symfony cada vez que se aade o se mueve una clase del proyecto. El comando utilizadopara borrar la cache es symfony clear-cache. El Captulo 12 explica con detalle el mecanismo de

    cache y la configuracin de la carga automtica de clases se muestra en el captulo 19.

    2.4. Resumen

    Captulo 2. Explorando el interior de Symfony

    www.librosweb.es 43

  • El uso de un framework que utiliza MVC obliga a dividir y organizar el cdigo de acuerdo a las

    convenciones establecidas por el framework. El cdigo de la presentacin se guarda en la vista,

    el cdigo de manipulacin de datos se guarda en el modelo y la lgica de procesamiento de las

    peticiones constituye el controlador. Aplicar el patrn MVC a una aplicacin resulta bastante

    til adems de restrictivo.

    Symfony es un framework de tipo MVC escrito en PHP 5. Su estructura interna se ha diseado

    para obtener lo mejor del patrn MVC y la mayor facilidad de uso. Gracias a su versatilidad y

    sus posibilidades de configuracin, Symfony es un framework adecuado para cualquier

    proyecto de aplicacin web.

    Ahora que ya has aprendido la teora que est detrs de Symfony, estas casi preparado para

    desarrollar tu primera aplicacin. Pero antes de eso, necesitas tener instalado Symfony en tu

    servidor de desarrollo.

    Symfony, la gua definitiva

    44 www.librosweb.es

  • Captulo 3. Ejecutar aplicaciones SymfonyComo se ha visto en los captulos anteriores, el framework Symfony est formado por un

    conjunto de archivos escritos en PHP. Los proyectos realizados con Symfony utilizan estos

    archivos, por lo que la instalacin de Symfony consiste en obtener esos archivos y hacer que

    estn disponibles para los proyectos.

    Como Symfony es un framework creado con PHP 5, es obligatorio disponer de la versin 5 de

    PHP. Por tanto, es necesario asegurarse de que se encuentra instalado, para lo cual se puede

    ejecutar el siguiente comando en la lnea de comandos del sistema operativo:

    > php -v

    PHP 5.2.0 (cli) (built: Nov 2 2006 11:57:36)

    Copyright (c) 1997-2006 The PHP Group

    Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies

    Si el nmero de la versin que se muestra es 5.0 o superior, ya es posible realizar la instalacin

    de Symfony que se describe en este captulo.

    3.1. Instalando el entorno de pruebas

    Si lo nico que quieres es comprobar lo que puede dar de s Symfony, lo mejor es que te

    decantes por la instalacin rpida. En este caso, se utiliza el entorno de pruebas o sandbox.

    El entorno de pruebas est formado por un conjunto de archivos. Contiene un proyecto vaco

    de Symfony e incluye todas las libreras necesarias (Symfony, Pake, Lime, Creole, Propel y

    Phing), una aplicacin de prueba y la configuracin bsica. No es necesario realizar ninguna

    configuracin en el servidor ni instalar ningn paquete adicional para que funcione

    correctamente.

    Para instalar el entorno de pruebas, se debe descargar su archivo comprimido desde

    http://www.symfony-project.com/get/sf_sandbox.tgz. A continuacin, se descomprime su

    contenido en el directorio raz del servidor web, que normalmente es web/ o www/. Para asegurar

    cierta uniformidad en la documentacin, en este captulo se supone que se ha descomprimido

    el entorno de pruebas en el directorio sf_sandbox/.

    Captulo 3. Ejecutar aplicaciones Symfony

    www.librosweb.es 45

  • ATENCIN

    Para hacer pruebas en un servidor local, se pueden colocar todos los archivos en la raz del servidorweb. Sin embargo, se trata de una mala prctica para los servidores de produccin, ya que losusuarios pueden ver el funcionamiento interno de la aplicacin.

    Se puede comprobar si se ha realizado correctamente la instalacin del entorno de pruebas

    mediante los comandos proporcionados por Symfony. Entra en el directorio sf_sandbox/ y

    ejecuta el siguiente comando en los entornos *nix:

    > ./symfony -V

    En los sistemas Windows, ejecuta el siguiente comando:

    > symfony -V

    El resultado del comando debera mostrar la versin del entorno de pruebas:

    symfony version 1.0.0

    A continuacin, se prueba si el servidor web puede acceder al entorno de pruebas mediante la

    siguiente URL:

    http://localhost/sf_sandbox/web/frontend_dev.php/

    Si todo ha ido bien, deberas ver una pgina de bienvenida como la que se muestra en la figura

    3-1, con lo que la instalacin rpida se puede dar por concluida. Si no se muestra esa pgina, se

    mostrar un mensaje de error que te indica los cambios necesarios en la configuracin.

    Tambin puedes consultar la seccin Resolucin de problemas que se encuentra ms

    adelante en este captulo.

    Symfony, la gua definitiva

    46 www.librosweb.es

  • Figura 3.1. Pgina de bienvenida del entorno de pruebas

    El entorno de pruebas est pensado para que practiques con Symfony en un servidor local, no

    para desarrollar aplicaciones complejas que acaban siendo publicadas en la web. No obstante,

    la versin de Symfony que est incluida en el entorno de pruebas es completamente funcional y

    equivalente a la que se instala va PEAR.

    Para desinstalar el entorno de pruebas, borra el directorio sf_sandbox/ de la carpeta web/ de tu

    servidor.

    Captulo 3. Ejecutar aplicaciones Symfony

    www.librosweb.es 47

  • 3.2. Instalando las libreras de Symfony

    Al desarrollar aplicaciones con Symfony, es probable que tengas que instalarlo dos veces: una

    para el entorno de desarrollo y otra para el servidor de produccin (a no ser que el servicio de

    hosting que utilices tenga Symfony preinstalado). En cada uno de los servidores lo lgico es

    evitar duplicidades juntando todos los archivos de Symfony en un nico directorio,

    independientemente de que desarrolles una o varias aplicaciones.

    Como el desarrollo de Symfony evoluciona rpidamente, es posible que est disponible una

    nueva versin estable del framework unos das despus de la primera instalacin. La

    actualizacin del framework es algo a tener muy en cuenta, por lo que se trata de otra razn de

    peso para juntar en un nico directorio todas las libreras de Symfony.

    Existen dos alternativas para instalar las libreras necesarias para el desarrollo de las

    aplicaciones:

    La instalacin que utiliza PEAR es la recomendada para la mayora de usuarios. Con

    este mtodo, la instalacin es bastante sencilla, adems de ser fcil de compartir y de

    actualizar.

    La instalacin que utiliza Subversion (SVN) solamente se recomienda para los

    programadores de PHP ms avanzados y es el mtodo con el que pueden obtener los

    ltimos parches, pueden aadir sus propias caractersticas al framework y pueden

    colaborar con el proyecto Symfony.

    Symfony integra algunos paquetes externos:

    pake es una utilidad para la lnea de comandos.

    lime es una utilidad para las pruebas unitarias.

    Creole es un sistema de abstraccin de la base de datos. Se trata de un sistema similar a

    los PHP Data Objects (PDO) y proporciona una interfaz entre el cdigo PHP y el cdigo

    SQL de la base de datos, permitiendo cambiar fcilmente de sistema gestor de bases de

    datos.

    Propel se utiliza para el ORM. Proporciona persistencia para los objetos y un servicio de

    consultas.

    Symfony, la gua definitiva

    48 www.librosweb.es

  • Phing es una utilidad de lnea de comandos para Propel.

    Pake y lime han sido desarrollados por el equipo de Symfony. Creole, Propel y Phing han sido

    creados por otros equipos de desarrollo y se publican bajo la licencia GNU Lesser Public

    General License (LGPL). Todos estos paquetes estn incluidos en Symfony.

    3.2.1. Instalando Symfony con PEAR

    El paquete PEAR de Symfony incluye las libreras propias de Symfony y todas sus

    dependencias. Adems, tambin contiene un script que permite extender la lnea de comandos

    del sistema para que funcione el comando symfony.

    Para instalar Symfony de esta manera, en primer lugar se debe aadir el canal Symfony a

    PEAR mediante este comando:

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

    Para comprobar las libreras disponibles en ese canal, se puede ejecutar lo siguiente:

    > pear remote-list -c symfony

    Una vez aadido el canal, ya es posible instalar la ltima versin estable de Symfony mediante

    el siguiente comando:

    > pear install symfony/symfony

    downloading symfony-1.0.0.tgz ...

    Starting to download symfony-1.0.0.tgz (1,283,270 bytes)

    .................................................................

    .................................................................

    .............done: 1,283,270 bytes

    install ok: channel://pear.symfony-project.com/symfony-1.0.0

    Y la instalacin ya ha terminado. Los archivos y las utilidades de lnea de comandos de

    Symfony ya se han instalado. Para asegurarte de que se ha instalado correctamente, prueba a

    ejecutar el comando symfony para que te muestre la versin de Symfony que se encuentra

    instalada:

    Captulo 3. Ejecutar aplicaciones Symfony

    www.librosweb.es 49

  • > symfony -V

    symfony version 1.0.0

    SUGERENCIA

    Si prefieres instalar la versin beta ms reciente, que tiene las ltimas correcciones de errores y lasltimas mejoras, puedes ejecutar el comando pear install symfony/symfony-beta. Sin embargo, las

    versiones beta no son estables y por tanto no se recomiendan para los servidores de produccin.

    Despus de la instalacin, las libreras de Symfony se encuentran en los siguientes directorios:

    $php_dir/symfony/ contiene las principales libreras.

    $data_dir/symfony/ contiene la estructura bsica de las aplicaciones Symfony; los

    mdulos por defecto; y la configuracin, datos para i18 (internacionalizacin), etc.

    $doc_dir/symfony/ contiene la documentacin.

    $test_dir/symfony/ contiene las pruebas unitarias.

    Las variables que acaban en _dir se definen en la configuracin de PEAR. Para ver sus valores,

    puedes ejecutar el siguiente comando:

    > pear config-show

    3.2.2. Obtener Symfony mediante el repositorio SVN

    En los servidores de produccin, o cuando no es posible utilizar PEAR, se puede descargar la

    ltima versin de las libreras Symfony directamente desde el repositorio Subversion que

    utiliza Symfony:

    > mkdir /ruta/a/symfony

    > cd /ruta/a/symfony

    > svn checkout http://svn.symfony-project.com/tags/RELEASE_1_0_0/ .

    El comando symfony, que solamente est disponible en las instalaciones PEAR, en realidad es

    una llamada al script que se encuentra en /ruta/a/symfony/data/bin/symfony. Por tanto, en una

    instalacin realizada con SVN, el comando symfony -V es equivalente a:

    Symfony, la gua definitiva

    50 www.librosweb.es

  • > php /ruta/a/symfony/data/bin/symfony -V

    symfony version 1.0.0

    Probablemente ya tenas creado algn proyecto de Symfony antes de realizar la instalacin

    mediante SVN. En este caso, es necesario modificar el valor de 2 variables en el archivo de

    configuracin config/config.php del proyecto:

  • > mkdir ~/miproyecto

    > cd ~/miproyecto

    > symfony init-project miproyecto

    Si has instalado Symfony mediante SVN, puedes crear un proyecto con los siguientes

    comandos:

    > mkdir ~/miproyecto

    > cd ~/miproyecto

    > php /path/to/symfony/data/bin/symfony init-project miproyecto

    El comando symfony siempre debe ejecutarse en el directorio raz del proyecto (en este ejemplo,

    miproyecto/) ya que todas las tareas que realiza este comando son especficas para cada

    proyecto.

    La estructura de directorios creada por Symfony se muestra a continuacin:

    apps/

    batch/

    cache/

    config/

    data/

    doc/

    lib/

    log/

    plugins/

    test/

    web/

    SUGERENCIA

    La tarea init-project aade un script llamado symfony en el directorio raz del proyecto. Este script

    es idntico al comando symfony que instala PEAR, por lo que se puede utilizar la instruccin php

    symfony en vez del comando symfony cuando no se dispone de las utilidades de la lnea de comandos

    (lo que sucede cuando se instala Symfony mediante SVN).

    Symfony, la gua definitiva

    52 www.librosweb.es

  • 3.3.2. Crear la Aplicacin

    El proyecto recin creado est incompleto, ya que requiere por lo menos de una aplicacin.

    Para crear la aplicacin, se utiliza el comando symfony init-app, al que se le tiene que pasar

    como argumento el nombre de la nueva aplicacin:

    > symfony init-app miaplicacion

    El comando anterior crea un directorio llamado miaplicacion/ dentro del directorio apps/ que

    se encuentra en la raz del proyecto. Por defecto se crea una configuracin bsica de la

    aplicacin y una serie de directorios:

    apps/

    miaplicacion/

    config/

    i18n/

    lib/

    modules/

    templates/

    En el directorio web del proyecto tambin se crean algunos archivos PHP correspondientes a los

    controladores frontales de cada uno de los entornos de ejecucin de la aplicacin:

    web/

    index.php

    miaplicacion_dev.php

    El archivo index.php es el controlador frontal de produccin de la nueva aplicacin. Como se

    trata de la primera aplicacin, Symfony crea un archivo llamado index.php en vez de

    miaplicacion.php (si despus se crea una nueva aplicacin llamada por ejemplo

    minuevaaplicacion, el controlador frontal del entorno de produccin que se crea se llamar

    minuevaaplicacion.php). Para ejecutar la aplicacin en el entorno de desarrollo, se debe ejecutar

    el controlador frontal llamado miaplicacion_dev.php. El Captulo 5 explica en detalle los

    distintos entornos de ejecucin.

    3.4. Configurar el servidor web

    Captulo 3. Ejecutar aplicaciones Symfony

    www.librosweb.es 53

  • Los scripts que se encuentran en el directorio web/ son los nicos puntos de entrada a la

    aplicacin. Por este motivo, debe configurarse el servidor web para que puedan ser accedidos

    desde Internet. En el servidor de desarrollo y en los servicios de hosting profesionales, se suele

    tener acceso a la configuracin completa de Apache para poder configurar servidores virtuales

    (virtual host). En los servicios de alojamiento compartido, lo normal es tener acceso solamente

    a los archivos .htaccess.

    3.4.1. Configurar los servidores virtuales

    El listado 3-1 muestra un ejemplo de la configuracin necesaria para crear un nuevo servidor

    virtual en Apache mediante la modificacin del archivo httpd.conf.

    Listado 3-1 - Ejemplo de configuracin de Apache, en apache/conf/httpd.conf

    ServerName miaplicacion.ejemplo.com

    DocumentRoot "/home/steve/miproyecto/web"

    DirectoryIndex index.php

    Alias /sf /$sf_symfony_data_dir/web/sf

    AllowOverride All

    Allow from All

    AllowOverride All

    Allow from All

    En la configuracin del listado 3-1, se debe sustituir la variable $sf_symfony_data_dir por la ruta

    real del directorio de datos de Symfony. Por ejemplo, la ruta en un sistema *nix en el que se ha

    instalado Symfony mediante PEAR sera:

    Alias /sf /usr/local/lib/php/data/symfony/web/sf

    Symfony, la gua definitiva

    54 www.librosweb.es

  • NOTA

    No es obligatorio el alias al directorio web/sf/. La finalidad del alias es permitir que Apache pueda

    encontrar las imgenes, hojas de estilos y archivos de JavaScript utilizados en la barra de depuracin,en el generador automtico de aplicaciones de gestin, en las pginas propias de Symfony y en lasutilidades de Ajax. La alternativa a crear este alias podra ser la de crear un enlace simblico (symlink)o copiar directamente los contenidos del directorio /$sf_symfony_data_dir/web/sf/ al directorio

    miproyecto/web/sf/.

    No te olvides reiniciar Apache para que los cambios surjan efecto. La aplicacin recin creada

    ya se puede acceder con cualquier navegador en esta direccin:

    http://localhost/miaplicacion_dev.php/

    Al acceder a la aplicacin, se debera mostrar una imagen similar a la mostrada en la figura 3-1.

    Reescritura de URL (URL Rewriting)

    Symfony utiliza la reescritura de URL para mostrar URL limpias en la aplicacin, es decir, URL conmucho sentido, optimizadas para buscadores y que ocultan a los usuarios los detalles tcnicosinternos de la aplicacin. El Captulo 9 explica en detalle el sistema de enrutamiento utilizado porSymfony y su implicacin en las URL de las aplicaciones.

    Para que funcione correctamente la reescritura de URL, es necesario que Apache est compilado conel mdulo mod_rewrite o al menos que est instalado el mdulo mod_rewrite como mdulo DSO. En

    este ltimo caso, la configuracin de Apache debe contener las siguientes lneas en el archivohttpd.conf:

    AddModule mod_rewrite.c

    LoadModule rewrite_module modules/mod_rewrite.so

    Para los servidores IIS (Internet Information Services) es necesario disponer de isapi/rewrite

    instalado y activado. El sitio web del proyecto Symfony (http://www.symfony-project.com) dispone

    de ms documentacin sobre la instalacin de Symfony en servidores IIS.

    3.4.2. Configurar un servidor compartido

    En los servidores de alojamiento compartido es un poco ms complicado instalar las

    aplicaciones creadas con Symfony, ya que los servidores suelen tener una estructura de

    directorios que no se puede modificar.

    Captulo 3. Ejecutar aplicaciones Symfony

    www.librosweb.es 55

  • ATENCIN

    No es recomendable hacer las pruebas y el desarrollo directamente en un servidor compartido. Unade las razones es que la aplicacin es pblica incluso cuando no est terminada, pudiendo mostrar sufuncio