Ver índice de contenidos del libro

19.2. Extendiendo la carga automática de clases

La carga automática de clases, explicada brevemente en el capítulo 2, evita tener que incluir manualmente las clases que se utilizan en el código, siempre que esas clases se encuentren en un directorio específico. De esta forma, el framework se encarga automáticamente de cargar solamente las clases que hacen falta y de incluirlas en el momento en el que se necesitan.

El archivo autoload.yml almacena un listado de todas las rutas en las que se encuentran las clases que se cargan automáticamente. La primera vez que se procesa este archivo de configuración, Symfony recorre todos los directorios indicados en el archivo. Cada vez que se encuentra un archivo terminado en .php en alguno de estos directorios, la ruta del archivo y los nombres de las clases que se encuentran en el archivo se añaden a un listado interno de las clases que se cargan automáticamente. El listado se guarda en la cache, en un archivo llamado config/config_autoload.yml.php. Posteriormente, durante la ejecución de la aplicación, cuando se necesita una clase, Symfony busca en esta lista la ruta hasta la clase y añade el archivo .php de forma automática.

La carga automática de clases funciona para todos los archivos de tipo .php que contengan clases y/o interfaces.

Por defecto, las clases que se encuentran en los siguientes directorios de los proyectos se benefician directamente de la carga automática de clases:

  • miproyecto/lib/
  • miproyecto/lib/model
  • miproyecto/apps/frontend/lib/
  • miproyecto/apps/frontend/modules/mimodulo/lib

En el directorio de configuración de la aplicación, no existe por defecto un archivo llamado autoload.yml. Si se quieren modificar las opciones del framework, por ejemplo para cargar automáticamente las clases que se encuentran en otro directorio, se crea un archivo autoload.yml vacío y se redefinen las opciones del archivo sfConfig::get('sf_symfony_lib_dir')/config/config/autoload.yml o se crean nuevas opciones.

El archivo autoload.yml comienza con la clave autoload: e incluye un listado de los directorios en los que Symfony debe buscar las clases existentes. Para cada directorio se debe indicar una etiqueta, de forma que sea posible redefinir las opciones por defecto de Symfony. Para cada directorio se indica un nombre (name) (que aparecerá en forma de comentario en config_autoload.yml.php) y una ruta absoluta (path). A continuación, se define si la búsqueda que realiza Symfony debe ser recursiva (recursive) y por tanto, debe buscar archivos de tipo .php en todos los subdirectorios del directorio indicado; también se pueden indicar los subdirectorios que se excluyen (mediante exclude). El listado 19-3 muestra los directorios utilizados por defecto y la sintaxis empleada.

Listado 19-3 - Configuración por defecto de la carga automática de clases, en sfConfig::get('sf_symfony_lib_dir')/config/config/autoload.yml

autoload:
  # plugins
  plugins_lib:
    name:           plugins lib
    path:           %SF_PLUGINS_DIR%/*/lib
    recursive:      true

  plugins_module_lib:
    name:           plugins module lib
    path:           %SF_PLUGINS_DIR%/*/modules/*/lib
    prefix:         2
    recursive:      true
 
  # project
  project:
    name:           project
    path:           %SF_LIB_DIR%
    recursive:      true
    exclude:        [model, symfony]

  project_model:
    name:           project model
    path:           %SF_LIB_DIR%/model
    recursive:      true
 
  # application
  application:
    name:           application
    path:           %SF_APP_LIB_DIR%
    recursive:      true

  modules:
    name:           module
    path:           %SF_APP_DIR%/modules/*/lib
    prefix:         1
    recursive:      true

Las rutas indicadas pueden utilizar comodines y también pueden utilizar los parámetros definidos en las clases de configuración para las rutas más utilizadas (que se explica en la siguiente sección). Si se utilizan estos valores en el archivo de configuración, se deben escribir en mayúsculas y encerrados por caracteres %

Aunque modificar el archivo autoload.yml permite indicar nuevas rutas en las que Symfony debe utilizar la carga automática de clases, también es posible extender el mecanismo utilizado por Symfony y añadir un gestor propio para realizar la carga automática de clases. Como Symfony utiliza la función estándar spl_autoload_register() para gestionar la carga automática de clases, resulta muy sencillo registrar otros gestores en la clase de configuración de la aplicación:

class frontendConfiguration extends sfApplicationConfiguration
{
  public function initialize()
  {
    parent::initialize(); // primero se carga Symfony
 
    // aquí se definen los gestores propios para la carga automática de clases
    spl_autoload_register(array('miToolkit', 'autoload'));
  }
}

Cuando el mecanismo de carga automática de clases de PHP encuentra una clase nueva, en primer lugar intenta utilizar el sistema de carga automática de clases de Symfony (utilizando los directorios definidos en el archivo autoload.yml). Si no encuentra la clase, prueba las otras funciones de carga automática registradas con spl_autoload_register(), hasta que encuentra la clase. Por tanto, se pueden añadir tantos mecanismos de carga automática de clases como sean necesarios, por ejemplo para proporcionar enlaces o puentes con los componentes de otros frameworks (ver capítulo 17).