- path/to/some/directory/
- acls/
- Site.php
- forms/
- Login.php
- models/
- User.php
Programmer's Reference Guide
| L'autoloader |
Autoloaders de ressources
Les autoloaders de ressources servent à manipuler du code de librairies dans des espaces de noms, respectant les conventions de codage du Zend Framework, mais n'ayant pas une correspondance 1:1 entre le nom de la classe et la structure du dossier. Leur but est de faciliter le chargement du code des ressources de l'application, comme les modèles, les ACLs, les formulaires...
Les autoloaders de ressources s'enregistrent dans l'autoloader à leur instanciation, avec l'espace de noms auxquels ils sont rattachés. Ceci permet de facilement isoler du code dans des dossiers, sous l'espace de noms, tout en gardant les bénéfices de l'autoload.
Utilisation de l'autoloader de ressources
Soit la structure de répertoires suivante :
Au sein de ce répertoire, toutes les classes sont préfixées par l'espace de noms "My_". Dans le dossier "acls", le préfixe de composant "Acl_" est ajouté, ce qui donne un nom de classe final "My_Acl_Site". Aussi, le dossier "forms" correspond à "Form_", ce qui donne "My_Form_Login". Le dossier "models" n'a pas d'espace de noms particulier, donnant donc "My_User".
Pour instancier un autoloader de ressoucres, il faut au minimum lui passer son dossier de travail (base path), et le nom de l'espace de noms correspondant :
- 'basePath' => 'path/to/some/directory',
- 'namespace' => 'My',
- ));
Note: Espace de noms de base
Dans Zend_Loader_Autoloader, vous devez spécifier le underscore final ("_") dans votre espace de noms. Zend_Loader_Autoloader_Resource suppose par contre que tout le code à auto-charger utilisera le séparateur d'espaces de noms underscore. Ainsi, vous n'avez pas besoin de le préciser avec l'autoloader de ressources.
Maintenant que notre autoloader est configuré, nous pouvons ajouter des composants à auto-charger. Ceci se fait via la méthode addResourceType(), qui accepte 3 arguments : un "type" de ressource, utiliser en interne comme nom de référence ; le sous dossier dans lequel la ressource en question est logé, et l'espace de noms du composant à rajouter à l'espace de noms général. Voici un exemple :
- $resourceLoader->addResourceType('acl', 'acls/', 'Acl')
- ->addResourceType('form', 'forms/', 'Form')
- ->addResourceType('model', 'models/');
Aussi, vous auriez pu effectuer la même action avec un tableau PHP. addResourceTypes() est alors appropriée :
Enfin, vous pouvez spécifier tout cela d'un seul coup avec des tableaux nichés. La clé doit alors être "resourceTypes" :
- 'basePath' => 'path/to/some/directory',
- 'namespace' => 'My',
- 'path' => 'acls/',
- 'namespace' => 'Acl',
- ),
- 'path' => 'forms/',
- 'namespace' => 'Form',
- ),
- 'path' => 'models/',
- ),
- ),
- ));
L'autoloader de ressource Module
Zend Framework fournit une implémentation concrète de Zend_Loader_Autoloader_Resource qui contient des correspondances de ressources pour mettre en avant la structure modulaire par défaut que propose le Zend Framework dans ses applications MVC. Ce chargeur, Zend_Application_Module_Autoloader, propose le mapping suivant :
- forms/ => Form
- models/ => Model
- DbTable/ => Model_DbTable
- mappers/ => Model_Mapper
- plugins/ => Plugin
- services/ => Service
- views/
- helpers => View_Helper
- filters => View_Filter
Par exemple, avec un module dont le préfixe est "Blog_", le chargement de la classe "Blog_Form_Entry" mènerait au chargement du fichier "forms/Entry.php".
En utilisant les bootstraps de modules avec Zend_Application, une instance de Zend_Application_Module_Autoloader sera crée pour chaque module utilisé.
Utiliser les autoloaders de ressources comme fabriques d'objets
Référence de l'autoloader de ressources
| L'autoloader |
Add A Comment
Please do not report issues via comments; use the ZF Issue Tracker.
If you have a JIRA/Crowd account, we suggest you login first before commenting.

Comments
I add a resource to the resource autoloader like in the examples above. for my example I will use form.
$resourceLoader->addResourceType('form', 'forms/', 'Form');
On my local machine my directory can look like the following example, and can auto load the files without error given that the class name follows the directory.
forms/
- Login.php (Form_Login)
- Signup.php (Form_Signup)
- Admin/
- - News.php (Form_Admin_News)
- - User.php (Form_Admin_User)
But on my remote test server the auto loader fails and returns an error:
Fatal error: Class 'Form_Admin_News' not found in /application/controllers/AdminController.php on line 53
on my Dev System (ZendserverCE on MAC) al walks fine, but on my production system with ubuntu 8.04 it fail:
Fatal error: Class 'Media_Model_DbTable_Sources' not found in /www/projectname/application/modules/media/controllers/SourcesController.php on line 20
I can not find a solution. :(
d
I'm using this:
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'path/to/some/directory',
'namespace' => 'My',
'resourceTypes' => array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
),
),
));
It's copied from this tutorial.
I'm getting an Exception:
Fatal error: Uncaught exception 'Zend_Loader_Exception' with message 'Initial definition of a resource type must include a namespace' in C:\Program Files\Zend\ZendServer\share\ZendFramework\library\Zend\Loader\Autoloader\Resource.php:276 Stack trace: #0
...
Why?!
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'path/to/some/directory',
'namespace' => 'My',
'resourceTypes' => array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
),
),
));
Note the missing namespace in the 'model' resource type. That example should actually be:
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'path/to/some/directory',
'namespace' => 'My',
'resourceTypes' => array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
'namespace' => 'Model',
),
),
));
Even if you set things up as shown in the above example don't forget you need to include the namespaces names in your class names too!
So if you have:
$user = new My_Model_User();
and this refers to the User.php file sat under application_directory/models/User.php
you still must make sure that the user class name is actually My_Model_User
class My_Model_User {
//code
}
Zend do this themselves too. For example if you load the config.php class in the Zend library directory via the autoloader you will see that the class name in that file is Zend_Config.php
If you would name the class:
class User {
}
then you will get the "class not found" error.
This may seem obvious to many but it had me baffled when I started out using the Zend Framework in the MVC style.
I think Zend could give more detailed examples as that would help.
Alguien me explica?
Indeed, I was struggling to solve the 'Class Model_Users' not found error to finally realize that the mistake was because the file was wrongly named 'Model_Users.php' and not 'Users.php' as expected.
Cheers!
Any idea how to resolve this?
path/to/some/directory/
acls/
Site.php (ENSURE YOUR class's filename starts with UPPER CASE)
forms/
Login.php (ENSURE YOUR class's filename starts with UPPER CASE)
models/
User.php (ENSURE YOUR class's filename starts with UPPER CASE)
Zend_Loader_Autoloader works Capitalized!!
My_Acl_Site points to -->
/acls/Site.php NOT /acls/site.php
I'm new to Zend Framework, and i'm trying to understand something, what are the benefits of using the Zend_Application_Module_Autoloader and the namespace "My_" when im using the modules structure. Why not simply call the controller and classes by its names. What am I trying to avoid when using those tools?