Mi primer proyecto con Symfony 1.2.7 (parte I)

Symfony LogoDespués de ver que es Symfony e instalar Symfony en nuestra máquina, voy a poner los pasos que he seguido, y los problemas que me he encontrado (junto con su resolución) para crear mi primer proyecto con Symfony.

Antes de ponernos manos a la obra, es imporatante entender como estructura Symfony el código. Todo proyecto creado por Symfony consta de una serie de carpetas y archivos que contienen el código base del framework. El árbol de carpetas de un proyecto es:

Árbol de directorios Symfony

A su vez, los proyectos están divididos en aplicaciones y módulos, los cuales, suelen coincidir con las tablas de nuestra base de datos. En este primer proyecto, haremos un blog muy simple y le pondremos el nombre blog (para ser original), a su vez, estará formado por dos aplicaciones, el frontend (o la parte visible para los usuarios comunes) y el backend (el panel de administración). Por último, cada una de las aplicaciones tendrá dos modulos: post y comment:

Estructura proyecto Symfony

Estructura proyecto Symfony


Base de datos del proyecto

Para la base de datos de este primer proyecto, crearemos un modelo muy simple que constará de una tabla de posts y una tabla de comentarios con una relación 1:n, puesto que un post puede tener n comentarios.

Base de datos

Base de datos

Creando el proyecto

Una vez tenemos clara la definición de la base de datos, las aplicaciones y los módulos del proyecto, podemos empezar a dar forma a nuestro código.

  1. El primer paso será crear mediante el script que nos proporciona Symfony, un proyecto vacío, para ello, creamos una carpeta blog en, por ejemplo, /var/www/ y ejecutamos symfony generate:project <project>:
    mkdir -p /var/www/blog/
    cd /var/www/blog/
    symfony generate:project blog

    Esto nos habrá creado todo el árbol de directorios y archivos necesarios para poner en marcha nuestra web con este framework.

    NOTA!! Dependiendo del sistema operativo y de la instalación realizada, puede ser necesario utilizar el prefijo php antes de cada comando symfony (por ejemplo: > php symfony new blog)

  2. Ahora, le pediremos a Symfony que nos genere las dos aplicaciones definidas anteriormente: frontend y backend
    symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend
    symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret backend

    Al llamar a la tarea generate:app, también hemos pasado dos opciones relacionadas con la seguridad:

    • –escaping-strategy: Permite escapar la salida para evitar ataques XSS
    • –csrf-secret: Permite tokens de sesión en los formularios para prevenir los ataques CSRF
  3. El siguiente paso, será conectar nuestra aplicación con la base de datos, para ello, Symfony dispone de un archivo de configuración /var/www/blog/config/databases.yml en el que le indicaremos donde está localizada, a que base de datos y con que usuario y contraseña lo deberá hacer.Para este caso, daremos por hecho que la base de datos es MySQL, se encuentra en la máquina local y que estará codificada en utf8. Abrimos el archivo y modificamos los valores que pongo en negrita:
    all:
      propel:
        class:        sfPropelDatabase
        param:
          classname:  PropelPDO
          dsn:        mysql:dbname=DB-NAME;host=localhost
          username:   DB-USER
          password:   DB-PASSWORD
          encoding:   utf8
          persistent: true
          pooling:    true

    Con esto, ya tenemos configurado nuestro proyecto con la base de datos!!

  4. Una vez definida la conexión con la base de datos, creamos en el archivo /var/www/blog/config/schema.yml el esquema de la base de datos que representa el modelo de datos del proyecto:
    propel:
      post:
        _attributes:   { phpName: Post }
        id:
        title:         varchar(255)
        excerpt:       longvarchar
        body:          longvarchar
        created_at:
        updated_at:
      comment:
        _attributes:   { phpName: Comment }
        id:
        post_id:
        author:        varchar(255)
        email:         varchar(255)
        body:          longvarchar
        created_at:
        updated_at:

    Symfony, permite insertar una serie de opciones o atributos en su esquema de la base de datos, como por ejemplo phpName, que indica el nombre de la clase PHP utilizada para manejar cada tabla, además de ser capaz de deducir información del typo de campo a partir del nombre de la columna. Si por ejemplo una columna se llama id, salvo que se le indique lo contrario, Symfony supone que es la clave primaria de la tabla y, por tanto, que es de tipo entero, que no puede tomar valores null y que su valor se autoincrementa.

    Puedes ver más información sobre la syntaxis del esquema en la guía Symfony definitiva.

  5. Ahora que tenemos definido el esquema, ejecutamos el comando propel:build-model para generar en la carpeta /var/www/blog/lib/model las clases que se encargan de manejar la base de datos
    symfony propel:build-model

    NOTA!! Si en este punto, aparece un error “Could not perform XLST transformation. Make sure PHP has been compiled/configured to support XSLT.” es debido a que no tienes instalada la extensión xsl para PHP. Desde Ubuntu puedes instalarla con sudo apt-get instal php5-xsl

  6. Ya estamos listos para decirle a symfony que nos genere el script de creación de base de datos y lanzarlo:
    symfony propel:build-sql
    mysql -u DB-USER -p DB-NAME < /var/www/blog/data/sql/lib.model.schema.sql

    Nota!! Si antes de empezar el proyecto Symfony ya dispones de una base de datos, puedes hacer el trabajo inverso: generar el esquema y las clases PHP a partir de una base de datos existente.

  7. Nos vamos a nuestro navegador y visitamos la dirección http://localhost/blog/,si todo ha ido bien, deberíamos estar viendo una página similar a esta:
    Symfony Welcome Page

    Nota!! Si la página te aparece sin imágenes ni estilos, bájate el archivo comprimido de Symfony Sandbox y descompríme sólo la carpeta /sf_sandbox/web/sf/ dentro de /var/www/blog/web/, con esto verás las imágenes y estilos del entorno recién creado.

Para que no me quede este post demasiado largo, lo he dividido en dos. En la segunda parte de “Mi primer proyecto con Symfony 1.2.7” veremos como dar forma a la parte pública y privada, hacer uso del scaffolding para generar las acciones comunes CRUD (Create, Read, Update, Delete) o configurar el aspecto de las URLs.

6 thoughts on “Mi primer proyecto con Symfony 1.2.7 (parte I)

  1. Pingback: Mi primer proyecto con Symfony 1.2.7 (parte II)

  2. Hola urgente tengo un mega problema, no me crea el archivo lib.model.schema.sql
    voy por el capitulo 3 y ya hice el archivo yaml sin tabulaciones y ejecute los comandos primeros sin problema pero no me marca error simplemente no me crea ese archivo para las tablas de la BD y estoy usando mysql y funciona bien el mysql.

  3. Me da el mismo error…..en consola no me da ningun error, pero no me genera el archivo lib.model.schema.sql que me piden chequee en todos los cursos que he visto.

    Que pudiera ser eso…agradecer’ia su ayuda

  4. Todo perfecto, hasta el punto 5 cuando voy a generar las clases al ejecutar “symfony propel:build-model” da como resultado = “there are no tasks defined in the propel namespace” de igual forma con el comando “symfony propel:build-sql” y pues de la misma forma al verificar en el navegador http://localhost/blog/ no encuentra nada. alguien sabe cual puede ser el error? gracias por la publicacion.

  5. MISMO PROBLEMA que Gabriel! una lastima…..el tutorial es EXCELENTE

    Será que autor puede darnos luz al asunto ? 10^12 gracias

Comments are closed.