Zend_Loader-Autoloader-Resource.xml 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.loader.autoloader-resource">
  4. <title>Autoloaders de ressources</title>
  5. <para>
  6. Les autoloaders de ressources servent à manipuler du code de librairies dans des espaces de noms,
  7. respectant les conventions de codage du Zend Framework, mais n'ayant pas une correspondance
  8. 1:1 entre le nom de la classe et la structure du dossier. Leur but est de faciliter le chargement
  9. du code des ressources de l'application, comme les modèles, les ACLs, les formulaires ...
  10. </para>
  11. <para>
  12. Les autoloaders de ressources s'enregistrent dans l'<link
  13. linkend="zend.loader.autoloader">autoloader</link> à leur instanciation, avec l'espace de noms
  14. auquels ils sont rattachés. Ceci permet de facilement isoler du code dans des dossiers, sous l'espace
  15. de noms, tout en gardant les bénéfices de l'autoload.
  16. </para>
  17. <sect2 id="zend.loader.autoloader-resource.usage">
  18. <title>Utilisation de l'autoloader de ressources</title>
  19. <para>
  20. Soit la structure de répertoires suivante:
  21. </para>
  22. <programlisting role="text"><![CDATA[
  23. path/to/some/directory/
  24. acls/
  25. Site.php
  26. forms/
  27. Login.php
  28. models/
  29. User.php
  30. ]]></programlisting>
  31. <para>
  32. Au sein de ce répertoire, toutes les classes sont préfixées par l'espace de noms
  33. "My_". Dans le dossier "acls", le préfixe de composant "Acl_" est ajouté, ce qui
  34. donne un nom de classe final "My_Acl_Site". Aussi, le dossier "forms"
  35. correspond à "Form_", ce qui donne "My_Form_Login". Le dossier "models" n'a pas
  36. d'espace de noms particulier, donnant donc "My_User".
  37. </para>
  38. <para>
  39. Pour instancier un autoloader de ressoucres, il faut au minimum lui passer son dossier
  40. de travail (base path), et le nom de l'espace de noms correspondant:
  41. </para>
  42. <programlisting role="php"><![CDATA[
  43. $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
  44. 'basePath' => 'path/to/some/directory',
  45. 'namespace' => 'My',
  46. ));
  47. ]]></programlisting>
  48. <note>
  49. <title>Espace de noms de base</title>
  50. <para>
  51. Dans <classname>Zend_Loader_Autoloader</classname>, vous devez spécifier le
  52. underscore final ("_") dans votre espace de noms.
  53. <classname>Zend_Loader_Autoloader_Resource</classname> suppose par contre
  54. que tout le code à auto-charger utilisera le séparateur d'espaces de noms
  55. underscore. Ainsi, vous n'avez pas besoin de le préciser avec l'autoloader
  56. de ressources.
  57. </para>
  58. </note>
  59. <para>
  60. Maintenant que notre autoloader est configuré, nous pouvons ajouter des composants
  61. à auto-charger. Ceci se fait via la méthode <code>addResourceType()</code>, qui accepte
  62. 3 arguments : un "type" de ressource, utiliser en interne comme nom de référence; le sous
  63. dossier dans lequel la ressource en question est logé, et l'espace de noms du composant
  64. à rajouter à l'espace de noms général. Voici un exemple:
  65. </para>
  66. <programlisting role="php"><![CDATA[
  67. $resourceLoader->addResourceType('acl', 'acls/', 'Acl')
  68. ->addResourceType('form', 'forms/', 'Form')
  69. ->addResourceType('model', 'models/');
  70. ]]></programlisting>
  71. <para>
  72. Aussi, vous auriez pu effectuer la même action avec un tableau PHP.
  73. <code>addResourceTypes()</code> est alors appropriée:
  74. </para>
  75. <programlisting role="php"><![CDATA[
  76. $resourceLoader->addResourceTypes(array(
  77. 'acl' => array(
  78. 'path' => 'acls/',
  79. 'namespace' => 'Acl',
  80. ),
  81. 'form' => array(
  82. 'path' => 'forms/',
  83. 'namespace' => 'Form',
  84. ),
  85. 'model' => array(
  86. 'path' => 'models/',
  87. ),
  88. ));
  89. ]]></programlisting>
  90. <para>
  91. Enfin, vous pouvez spécifier tout cela d'un seul coup avec des tableaux nichés.
  92. La clé doit alors être "resourceTypes":
  93. </para>
  94. <programlisting role="php"><![CDATA[
  95. $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
  96. 'basePath' => 'path/to/some/directory',
  97. 'namespace' => 'My',
  98. 'resourceTypes' => array(
  99. 'acl' => array(
  100. 'path' => 'acls/',
  101. 'namespace' => 'Acl',
  102. ),
  103. 'form' => array(
  104. 'path' => 'forms/',
  105. 'namespace' => 'Form',
  106. ),
  107. 'model' => array(
  108. 'path' => 'models/',
  109. ),
  110. ),
  111. ));
  112. ]]></programlisting>
  113. </sect2>
  114. <sect2 id="zend.loader.autoloader-resource.module">
  115. <title>L'autoloader de ressource Module</title>
  116. <para>
  117. Zend Framework fournit une implémentation concrète de
  118. <classname>Zend_Loader_Autoloader_Resource</classname> qui contient des correspondances
  119. de ressources pour mettre en avant la structure modulaire par défaut que propose le
  120. Zend Framework dans ses applications MVC. Ce chargeur,
  121. <classname>Zend_Application_Module_Autoloader</classname>, propose le mapping suivant:
  122. </para>
  123. <programlisting role="text"><![CDATA[
  124. api/ => Api
  125. forms/ => Form
  126. models/ => Model
  127. DbTable/ => Model_DbTable
  128. plugins/ => Plugin
  129. ]]></programlisting>
  130. <para>
  131. Par exemple, avec un module dont le préfixe est "Blog_", le chargement de
  132. la classe "Blog_Form_Entry" mènerait au chargement du fichier "forms/Entry.php".
  133. </para>
  134. <para>
  135. En utilisant les bootstraps de modules avec <classname>Zend_Application</classname>, une
  136. instance de <classname>Zend_Application_Module_Autoloader</classname> sera crée pour chaque module
  137. utilisé.
  138. </para>
  139. </sect2>
  140. <sect2 id="zend.loader.autoloader-resource.factory">
  141. <title>Utiliser les autoloaders de ressources comme fabriques d'objets</title>
  142. <para></para>
  143. <!-- @todo -->
  144. </sect2>
  145. <sect2 id="zend.loader.autoloader-resource.reference">
  146. <title>Référence de l'autoloader de ressources</title>
  147. <para></para>
  148. <!-- @todo -->
  149. </sect2>
  150. <!-- @todo
  151. Write section on using load() functionality
  152. Potentially add functionality to load() to allow passing arguments
  153. Show how to use overloading to retrieve class instances
  154. Write reference section
  155. -->
  156. </sect1>