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/miaplicacion/lib/
  • miproyecto/apps/miaplicacion/modules/mimodelo/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 $sf_symfony_data_dir/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-2 muestra los directorios utilizados por defecto y la sintaxis empleada.

Listado 19-2 - Configuración por defecto de la carga automática de clases, en $sf_symfony_data_dir/config/autoload.yml

autoload:

  # symfony core
  symfony:
    name:           symfony
    path:           %SF_SYMFONY_LIB_DIR%
    recursive:      on
    exclude:        [vendor]

  propel:
    name:           propel
    path:           %SF_SYMFONY_LIB_DIR%/vendor/propel
    recursive:      on

  creole:
    name:           creole
    path:           %SF_SYMFONY_LIB_DIR%/vendor/creole
    recursive:      on

  propel_addon:
    name:           propel addon
    files:
      Propel:       %SF_SYMFONY_LIB_DIR%/addon/propel/sfPropelAutoload.php
 
  # plugins
  plugins_lib:
    name:           plugins lib
    path:           %SF_PLUGINS_DIR%/*/lib
    recursive:      on

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

  project_model:
    name:           project model
    path:           %SF_MODEL_LIB_DIR%
    recursive:      on
 
  # application
  application:
    name:           application
    path:           %SF_APP_LIB_DIR%
    recursive:      on

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

Las rutas indicadas pueden utilizar comodines y los valores de las opciones del archivo constants.php (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. La opción autoloading_functions del archivo settings.yml permite configurar este gestor propio, que se indica como un array de elementos ejecutables de PHP, de la siguiente forma:

.settings:
  autoloading_functions:
    - [miToolkit, autoload]

Cuando Symfony encuentra una clase nueva, en primer lugar intenta utilizar su propio sistema de carga automática de clases (utilizando los directorios definidos en el archivo autoload.yml). Si no encuentra la clase, prueba las otras funciones de carga automática definidas en el archivo settings.yml, hasta que consigue encontrar 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).