Ver índice de contenidos del libro

8.3. Las clases del modelo

El esquema se utiliza para construir las clases del modelo que necesita la capa del ORM. Para reducir el tiempo de ejecución de la aplicación, estas clases se generan mediante una tarea de línea de comandos llamada doctrine:build-model.

$ php symfony doctrine:build-model

Nota Después de construir el modelo, es necesario borrar la caché interna de Symfony mediante el comando php symfony cc para que Symfony sea capaz de encontrar los nuevos modelos.

Al ejecutar ese comando, se analiza el esquema y se generan las clases base del modelo, que se almacenan en el directorio lib/model/doctrine/base del proyecto:

  • BaseArticulo.php
  • BaseComentario.php

Además, se crean las verdaderas clases del modelo de datos en el directorio lib/model/doctrine:

  • Articulo.php
  • ArticuloTable.php
  • Comentario.php
  • ComentarioTable.php

Sólo se han definido dos modelos y se han generado seis archivos. Aunque este hecho no es nada extraño, merece una explicación.

8.3.1. Clases base y clases personalizadas

¿Por qué es útil mantener dos versiones del modelo de objetos de datos en dos directorios diferentes?

Puede ser necesario añadir métodos y propiedades personalizadas en los objetos del modelo (piensa por ejemplo en el método getNombreCompleto() del listado 8-1). También es posible que a medida que el proyecto se esté desarrollando, se añadan tablas o columnas. Además, cada vez que se modifica el archivo schema.yml se deben regenerar las clases del modelo de objetos mediante el comando doctrine:build-model. Si se añaden los métodos personalizados en las clases que se generan, se borrarían cada vez que se vuelven a generar esas clases.

Las clases con nombre Base del directorio lib/model/doctrine/base son las que se generan directamente a partir del esquema. Nunca modifiques estas clases, ya que cada vez que generas el modelo, estas clases se borran y se vuelven a crear automáticamente.

Por otra parte, las clases de objetos propias que están en el directorio lib/model/doctrine heredan de las clases con nombre Base. Estas clases no se modifican cuando se ejecuta la tarea doctrine:build-model, por lo que son las clases en las que añades tus propios métodos y código.

El listado 8-4 muestra un ejemplo de una clase propia del modelo creada la primera vez que se ejecuta la tarea doctrine:build-model.

Listado 8-4 - Archivo de ejemplo de una clase del modelo, en lib/model/doctrine/Articulo.php

class Articulo extends BaseArticulo
{
}

Esta clase hereda de la clase BaseArticulo, pero no le afectan las modificaciones en el esquema.

Este mecanismo de clases personalizadas que heredan de las clases base permite empezar a programar desde el primer momento, sin ni siquiera conocer el modelo relacional definitivo de la base de datos. La estructura de archivos creada permite personalizar y evolucionar el modelo.

8.3.2. Clases objeto y clases tabla

Articulo y Comentario son clases objeto que representan un registro de la base de datos. Permiten acceder a las columnas de un registro y a los registros relacionados. Por tanto, es posible obtener el título de un artículo invocando un método del objeto Articulo, como se muestra en el listado 8-5.

Listado 8-5 - Las clases objeto disponen de getters para los registros de las columnas

$articulo = new Articulo();
// ...
$titulo = $articulo->getTitulo();

ArticuloTable y ComentarioTable son clases de tipo tabla; es decir, clases que tienen métodos públicos para trabajar con las tablas de la base de datos. Proporcionan los medios necesarios para buscar registros en una tabla. Sus métodos devuelven normalmente un objeto o una colección de objetos de la clase objeto relacionada, como se muestra en el listado 8-6.

Listado 8-6 - Las clases tabla contienen métodos públicos para obtener registros de la base de datos

// $articulo es una instancia de la clase Articulo
$articulo = Doctrine_Core::getTable('Articulo')->find(123);