Symfony 1.0, la guía definitiva

14.1. Generación de código en función del modelo

En las aplicaciones web, las operaciones de acceso a los datos se pueden clasificar en una de las siguientes categorías:

  • Insertar un registro creation, en inglés)
  • Obtener registros retrieval, en inglés)
  • Modificar un registro o alguna de sus columnas update, en inglés)
  • Borrar un registro deletion, en inglés)

Como estas operaciones son tan comunes, se ha creado un acrónimo para referirse a todas ellas: CRUD (por las iniciales de sus nombres en inglés). Muchas páginas se reducen a alguna de esas operaciones. En un foro por ejemplo, el listado de los últimos mensajes es una operación de obtener registros y responder a un mensaje se corresponde con la opción de insertar un registro.

En muchas aplicaciones web se crean continuamente acciones y plantillas que realizan las operaciones CRUD para una determinada tabla de datos. En Symfony, el modelo contiene la información necesaria para poder generar de forma automática el código de las operaciones CRUD, de forma que se simplifica el desarrollo inicial de la aplicación y las interfaces de la parte de gestión de las aplicaciones.

Las tareas de generación de código a partir del modelo de datos crean un módulo entero, y se pueden ejecutar mediante el siguiente comando de Symfony:

> symfony <NOMBRE_TAREA> <NOMBRE_APLICACION> <NOMBRE_MODULO> <NOMBRE_CLASE>

Las tareas de generación de código son propel-init-crud, propel-generate-crud y propel-init-admin.

14.1.1. Scaffolding y administración

Durante la fase de desarrollo de una aplicación, se puede utilizar la generación de código para alguna de las siguientes tareas:

  • El "scaffolding" es una estructura básica de acciones y plantillas para poder realizar las operaciones CRUD en una tabla de la base de datos. El código generado es mínimo, ya que solo es una guía para seguir desarrollando. Se trata de la base inicial que debe adaptarse para seguir los requerimientos de lógica y presentación de la aplicación. El "scaffolding" se utiliza durante la fase de desarrollo de la aplicación para crear una acceso vía web a la base de datos, para construir un prototipo rápido o para realizar automáticamente el código básico de un módulo basado en una tabla de la base de datos.
  • La "administración" es una interfaz avanzada para manipular los datos y que se emplea en la parte de gestión o administración de las aplicaciones. La principal diferencia con el "scaffolding" es que el programador no modifica el código generado para la parte de administración. Mediante archivos de configuración y herencia de clases se puede personalizar y extender la parte de administración generada. La presentación de la interfaz es importante y por eso incluyen opciones como el filtrado, la paginación y la ordenación de datos. La parte de administración generada automáticamente con Symfony tiene calidad suficiente como para entregarla al cliente formando parte de la aplicación que se le ha desarrollado.

La línea de comandos de Symfony utiliza la palabra crud para referirse al "scaffolding" y admin para referirse a la parte de administración de la aplicación.

14.1.2. Generando e iniciando el código

Symfony dispone de dos formas para generar el código: mediante herencia (init) o mediante la generación automática de código (generate).

Los módulos se pueden "iniciar", esto es, crear una serie de clases vacías que heredan de las del framework. Este método enmascara el código PHP de las acciones y de las plantillas para evitar que sean modificadas. Se trata de un método útil cuando la estructura de datos puede variar o cuando se necesita crear rápidamente un interfaz para el acceso a la base de datos. El código que se ejecuta durante la ejecución de la aplicación no se encuentra en la aplicación, sino en la cache. Las tareas de la línea de comandos utilizadas para este tipo de generación comienzan con propel-init-.

El código de la acción generada está vacío. Si por ejemplo se inicia un módulo llamado articulo, el código de las acciones será el siguiente:

class articuloActions extends autoarticuloActions
{
}

Por otra parte, también es posible generar el código completo de las acciones y plantillas para que pueda ser modificado. El módulo resultante es por tanto, independiente de las clases del framework y no es posible adaptarlo utilizando exclusivamente archivos de configuración. Las tareas de la línea de comandos utilizadas para este tipo de generación comienzan con propel-generate-.

Como el objetivo del "scaffolding" es generar la base para futuros desarrollos, es mejor generar el "scaffolding" y no solo iniciarlo. Por otra parte, la parte de administración es fácil de actualizar mediante un cambio en los archivos de configuración y sigue siendo usable aunque se modifique el modelo de datos. Esta es la razón por la que en las administraciones el código de "inicia" y no sólo se "genera".

14.1.3. Modelo de datos de ejemplo

A lo largo de este capítulo, los listados de código muestran las posibilidades de los generadores de Symfony mediante un ejemplo sencillo, similar al utilizado en el Capítulo 8. Se trata de la típica aplicación para crear un blog, que contiene las clases Article y Comment. El listado 14-1 muestra el esquema de datos y la figura 14-1 lo ilustra.

Listado 14-1 - Archivo schema.yml de la aplicación de ejemplo

propel:
  blog_article:
    _attributes: { phpName: Article }
    id:
    title:       varchar(255)
    content:     longvarchar
    created_at:
  blog_comment:
    _attributes: { phpName: Comment }
    id:
    article_id:
    author:      varchar(255)
    content:     longvarchar
    created_at:
Modelo de datos de ejemplo

Figura 14.1 Modelo de datos de ejemplo

La generación de código no impone ninguna regla o restricción a la creación del esquema. Symfony utiliza el esquema tal y como se ha definido, interpreta sus atributos y genera el "scaffolding" o la parte de administración de la aplicación.

Truco Para aprovechar al máximo este capítulo, deberías hacer todos los ejemplos que se incluyen. Si se realizan todos los pasos descritos en los listados de código, se obtiene un mejor conocimiento de lo que genera Symfony y de lo que se puede llegar a hacer con el código generado. La recomendación es que crees una estructura de datos como la descrita anteriormente para crear una base de datos con las tablas blog_article y blog_comment, rellenándolas con datos de prueba.