1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.loader.autoloader-resource">
<title>Autoloaders de ressources</title>
<para>
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
<acronym>ACL</acronym>s, les formulaires...
</para>
<para>
Les autoloaders de ressources s'enregistrent dans l'<link
linkend="zend.loader.autoloader">autoloader</link> à 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.
</para>
<sect2 id="zend.loader.autoloader-resource.usage">
<title>Utilisation de l'autoloader de ressources</title>
<para>Soit la structure de répertoires suivante :</para>
<programlisting language="text"><![CDATA[
path/to/some/directory/
acls/
Site.php
forms/
Login.php
models/
User.php
]]></programlisting>
<para>
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" correspond à "Model_",
donnant donc "My_Model_User".
</para>
<para>
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 :
</para>
<programlisting language="php"><![CDATA[
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'path/to/some/directory',
'namespace' => 'My',
));
]]></programlisting>
<note>
<title>Espace de noms de base</title>
<para>
Dans <classname>Zend_Loader_Autoloader</classname>, vous devez spécifier le
underscore final ("_") dans votre espace de noms.
<classname>Zend_Loader_Autoloader_Resource</classname> 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.
</para>
</note>
<para>
Maintenant que notre autoloader est configuré, nous pouvons ajouter des composants
à auto-charger. Ceci se fait via la méthode <methodname>addResourceType()</methodname>, 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 :
</para>
<programlisting language="php"><![CDATA[
$resourceLoader->addResourceType('acl', 'acls/', 'Acl')
->addResourceType('form', 'forms/', 'Form')
->addResourceType('model', 'models/', 'Model');
]]></programlisting>
<para>
Aussi, vous auriez pu effectuer la même action avec un tableau <acronym>PHP</acronym>.
<methodname>addResourceTypes()</methodname> est alors appropriée :
</para>
<programlisting language="php"><![CDATA[
$resourceLoader->addResourceTypes(array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
'namespace' => 'Model',
),
));
]]></programlisting>
<para>
Enfin, vous pouvez spécifier tout cela d'un seul coup avec des tableaux nichés. La
clé doit alors être "resourceTypes" :
</para>
<programlisting language="php"><![CDATA[
$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',
),
),
));
]]></programlisting>
</sect2>
<sect2 id="zend.loader.autoloader-resource.module">
<title>L'autoloader de ressource Module</title>
<para>
Zend Framework fournit une implémentation concrète de
<classname>Zend_Loader_Autoloader_Resource</classname> qui contient des correspondances
de ressources pour mettre en avant la structure modulaire par défaut que propose le Zend
Framework dans ses applications <acronym>MVC</acronym>. Ce chargeur,
<classname>Zend_Application_Module_Autoloader</classname>, propose le mapping
suivant :
</para>
<programlisting language="text"><![CDATA[
forms/ => Form
models/ => Model
DbTable/ => Model_DbTable
mappers/ => Model_Mapper
plugins/ => Plugin
services/ => Service
views/
helpers => View_Helper
filters => View_Filter
]]></programlisting>
<para>
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".
</para>
<para>
En utilisant les bootstraps de modules avec
<classname>Zend_Application</classname>, une instance de
<classname>Zend_Application_Module_Autoloader</classname> sera crée pour chaque module
utilisé.
</para>
</sect2>
<sect2 id="zend.loader.autoloader-resource.factory">
<title>Utiliser les autoloaders de ressources comme fabriques d'objets</title>
<para></para>
<!-- @todo -->
</sect2>
<sect2 id="zend.loader.autoloader-resource.reference">
<title>Référence de l'autoloader de ressources</title>
<para></para>
<!-- @todo -->
</sect2>
<!-- @todo
Write section on using load() functionality
Potentially add functionality to load() to allow passing arguments
Show how to use overloading to retrieve class instances
Write reference section
-->
</sect1>
|