TigerZF
🌐Español

4.4. Autocarga de recursos

A menudo, al desarrollar una aplicación, resulta difícil empaquetar las clases en el estándar 1:1 de nombreClase:nombreArchivo recomendado por Zend Framework, o es ventajoso por motivos de empaquetado no hacerlo así. Sin embargo, esto significa que tus archivos de clase no serán encontrados por el autoloader.

Si lees los objetivos de diseño del autoloader, el último punto de esa sección indicaba que la solución debía cubrir esta situación. Zend Framework lo hace mediante Zend_Loader_Autoloader_Resource.

Un recurso es simplemente un nombre que corresponde a un espacio de nombres de componente (que se añade al espacio de nombres del autoloader) y una ruta (que es relativa a la ruta base del autoloader). En la práctica, harías algo como esto:

$loader = new Zend_Application_Module_Autoloader(array(
    'namespace' => 'Blog',
    'basePath'  => APPLICATION_PATH . '/modules/blog',
));

Una vez que tienes el loader en su lugar, necesitas informarle de los diferentes tipos de recursos de los que es consciente. Estos tipos de recursos son simplemente pares de subárbol y prefijo.

Como ejemplo, considera el siguiente árbol:

path/to/some/resources/
|-- forms/
|   `-- Guestbook.php        // Foo_Form_Guestbook
|-- models/
|   |-- DbTable/
|   |   `-- Guestbook.php    // Foo_Model_DbTable_Guestbook
|   |-- Guestbook.php        // Foo_Model_Guestbook
|   `-- GuestbookMapper.php  // Foo_Model_GuestbookMapper

Nuestro primer paso es crear el cargador de recursos:

$loader = new Zend_Loader_Autoloader_Resource(array(
    'basePath'  => 'path/to/some/resources/',
    'namespace' => 'Foo',
));

A continuación, necesitamos definir algunos tipos de recursos. Zend_Loader_Autoloader_Resourse::addResourceType() tiene tres argumentos: el "tipo" de recurso (una cadena arbitraria), la ruta bajo la ruta base en la que se puede encontrar el tipo de recurso, y el prefijo de componente a usar para el tipo de recurso. En el árbol anterior, tenemos tres tipos de recursos: form (en el subdirectorio "forms", con un prefijo de componente "Form"), model (en el subdirectorio "models", con un prefijo de componente "Model"), y dbtable (en el subdirectorio "models/DbTable", con un prefijo de componente "Model_DbTable"). Los definiríamos de la siguiente manera:

$loader->addResourceType('form', 'forms', 'Form')
       ->addResourceType('model', 'models', 'Model')
       ->addResourceType('dbtable', 'models/DbTable', 'Model_DbTable');

Una vez definidos, simplemente podemos usar estas clases:

$form      = new Foo_Form_Guestbook();
$guestbook = new Foo_Model_Guestbook();
[Note] Autocarga de recursos de módulos

La capa MVC de Zend Framework fomenta el uso de "módulos", que son aplicaciones autocontenidas dentro de tu sitio. Los módulos típicamente tienen varios tipos de recursos por defecto, y Zend Framework incluso recomienda una estructura de directorios estándar para los módulos. Los autoloaders de recursos son por lo tanto bastante útiles en este paradigma, tan útiles que están habilitados por defecto cuando creas una clase de bootstrap para tu módulo que extiende Zend_Application_Module_Bootstrap. Para más información, lee la documentación de Zend_Loader_Autoloader_Module.