Zend_Loader-Autoloader-Resource.xml 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.loader.autoloader-resource">
  5. <title>Ressource Autoloader</title>
  6. <para>
  7. Ressource Autoloader sind dazu gedacht Namespaced Bibliothekscode zu Managen der den
  8. Coding Standard Richtlinien vom Zend Framework folgt, welche aber kein 1:1 Mapping
  9. zwischen dem Klassennamen und der Verzeichnis Struktur haben. Ihr primärer Zweck ist es
  10. als Autoloader Anwendungs-Ressource Code zu arbeiten, wie z.B. für
  11. Anwendungs-spezifische Modelle, Formen, und ACLs.
  12. </para>
  13. <para>
  14. Ressource Autoloader werden mit dem
  15. <link linkend="zend.loader.autoloader">autoloader</link> bei der Instanziierung registriert,
  16. und zwar mit dem Namespace mit dem Sie assoziiert sind. Das erlaubt es Code in speziellen
  17. Verzeichnissen zu namespacen, und trotzdem die Vorteile des Autoloadings zu nutzen.
  18. </para>
  19. <sect2 id="zend.loader.autoloader-resource.usage">
  20. <title>Verwendung von Ressource Autoloadern</title>
  21. <para>
  22. Nehmen wir die folgende Verzeichnis Struktur an:
  23. </para>
  24. <programlisting role="text"><![CDATA[
  25. path/to/some/directory/
  26. acls/
  27. Site.php
  28. forms/
  29. Login.php
  30. models/
  31. User.php
  32. ]]></programlisting>
  33. <para>
  34. In diesem Verzeichnis hat jeder Code ein Präfix mit dem Namespace "My_". Im
  35. Unterverzeichnis "acls" ist der Komponentenpräfix "Acl_" hinzugefügt, was letztendlich
  36. zu einem Klassennamen von "My_Acl_Site" führt. So ähnlich mappt das Unterverzeichnis
  37. "forms" auf "Form_", was zu "My_Form_Login" führt. Das Unterverzeichnis "models" hat
  38. keinen Komponenten Namespace, was zu "My_User" führt.
  39. </para>
  40. <para>
  41. Man kann einen Ressource Autoloader verwenden um diese Klassen automatisch zu laden.
  42. um den Ressource Autoloader zu instanziieren ist es mindestens notwendig den
  43. Basispfad und den Namespace für die Ressourcen zu übergeben für die er verantwortlich
  44. ist:
  45. </para>
  46. <programlisting role="php"><![CDATA[
  47. $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
  48. 'basePath' => 'path/to/some/directory',
  49. 'namespace' => 'My',
  50. ));
  51. ]]></programlisting>
  52. <note>
  53. <title>Basis Namespace</title>
  54. <para>
  55. In <classname>Zend_Loader_Autoloader</classname> wird erwartet das man den endenden
  56. Unterstrich ("_") im Namespace angibt wenn der eigene Autoloader verwendet wird
  57. um den Namespace zu suchen. <classname>Zend_Loader_Autoloader_Resource</classname> nimmt an
  58. das alle Codes die man automatisch laden will ein Unterstrich Trennzeichen zwischen
  59. Namespace, Komponente und Klasse verwenden. Als Ergebnis, muß man den endenen
  60. Unterstrich nicht verwenden wenn ein Ressource Autoloader registriert wird.
  61. </para>
  62. </note>
  63. <para>
  64. Jetzt da wir den Basis Ressource Autoloader eingerichtet haben, können wir einige
  65. Komponenten zu Ihm hinzufügen um die automatisch zu Laden. Das wird mit der
  66. <code>addResourceType()</code> Methode getan, welche drei Argumente akzeptiert:
  67. einen Ressource "type", der intern als Referenzname verwendet wird; den Pfad des
  68. Unterverzeichnisses unter dem Basispfad in dem diese Ressource existiert; und den
  69. Namespace der Komponente die dem Basis Namespace hinzugefügt wird. Als Beispiel fügen
  70. wir jeden unserer Ressource Typen hinzu.
  71. </para>
  72. <programlisting role="php"><![CDATA[
  73. $resourceLoader->addResourceType('acl', 'acls/', 'Acl')
  74. ->addResourceType('form', 'forms/', 'Form')
  75. ->addResourceType('model', 'models/');
  76. ]]></programlisting>
  77. <para>
  78. Alternativ können diese als Array an <code>addResourceTypes()</code> übergeben werden;
  79. das folgende ist äquivalent zu dem obigen:
  80. </para>
  81. <programlisting role="php"><![CDATA[
  82. $resourceLoader->addResourceTypes(array(
  83. 'acl' => array(
  84. 'path' => 'acls/',
  85. 'namespace' => 'Acl',
  86. ),
  87. 'form' => array(
  88. 'path' => 'forms/',
  89. 'namespace' => 'Form',
  90. ),
  91. 'model' => array(
  92. 'path' => 'models/',
  93. ),
  94. ));
  95. ]]></programlisting>
  96. <para>
  97. Letztendlich kann alles davon spezifiziert werden wenn das Objekt instanziiert wird
  98. indem einfach ein "resourceTypes" Schlüssel in den Optionen spezifiziert und übergeben
  99. wird, sowie eine Struktur wie anbei:
  100. </para>
  101. <programlisting role="php"><![CDATA[
  102. $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
  103. 'basePath' => 'path/to/some/directory',
  104. 'namespace' => 'My',
  105. 'resourceTypes' => array(
  106. 'acl' => array(
  107. 'path' => 'acls/',
  108. 'namespace' => 'Acl',
  109. ),
  110. 'form' => array(
  111. 'path' => 'forms/',
  112. 'namespace' => 'Form',
  113. ),
  114. 'model' => array(
  115. 'path' => 'models/',
  116. ),
  117. ),
  118. ));
  119. ]]></programlisting>
  120. </sect2>
  121. <sect2 id="zend.loader.autoloader-resource.module">
  122. <title>Der Modul Ressource Autoloader</title>
  123. <para>
  124. Zend Framework wird mit einer konkreten Implementation von
  125. <classname>Zend_Loader_Autoloader_Resource</classname> ausgeliefert die Ressourcen Typen enthält
  126. welche den notwendigen Standard Verzeichnisstrukturen für Zend Framework MVC
  127. Anwendungen entsprechen. Diese Lader, <classname>Zend_Application_Module_Autoloader</classname>,
  128. kommt mit den folgenden Mappings:
  129. </para>
  130. <programlisting role="text"><![CDATA[
  131. api/ => Api
  132. forms/ => Form
  133. models/ => Model
  134. DbTable/ => Model_DbTable
  135. plugins/ => Plugin
  136. ]]></programlisting>
  137. <para>
  138. Wenn man, als Beispiel, ein Modul mit dem Präfix "Blog_" hat, und die Klasse
  139. "Blog_Form_Entry" instanziieren will, würde diese in den Ressourcen Verzeichnis
  140. "forms/" im Unterverzeichnis nach einer Datei die "Entry.php" heißt suchen.
  141. </para>
  142. <para>
  143. Wenn Modul Bootstraps mit <classname>Zend_Application</classname> verwendet werden, wird
  144. standardmäßig eine Instanz von <classname>Zend_Application_Module_Autoloader</classname>
  145. für jede eigene Modul erstellt, was es erlaubt Modul Ressource automatisch zu laden.
  146. </para>
  147. </sect2>
  148. <sect2 id="zend.loader.autoloader-resource.factory">
  149. <title>Verwendung von Ressource Autoloadern als Objekt Factories</title>
  150. <para></para>
  151. <!-- @todo -->
  152. </sect2>
  153. <sect2 id="zend.loader.autoloader-resource.reference">
  154. <title>Referenz zu den Ressource Autoloadern</title>
  155. <para></para>
  156. <!-- @todo -->
  157. </sect2>
  158. <!-- @todo
  159. Write section on using load() functionality
  160. Potentially add functionality to load() to allow passing arguments
  161. Show how to use overloading to retrieve class instances
  162. Write reference section
  163. -->
  164. </sect1>