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 192 193
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 20250 -->
<!-- Reviewed: no -->
<sect1 id="zend.loader.autoloader-resource">
<title>Ressource Autoloader</title>
<para>
Ressource Autoloader sind dazu gedacht Namespaced Bibliothekscode zu Managen der den
Coding Standard Richtlinien vom Zend Framework folgt, welche aber kein 1:1 Mapping
zwischen dem Klassennamen und der Verzeichnis Struktur haben. Ihr primärer Zweck ist es
als Autoloader Anwendungs-Ressource Code zu arbeiten, wie z.B. für
Anwendungs-spezifische Modelle, Formen, und <acronym>ACL</acronym>s.
</para>
<para>
Ressource Autoloader werden mit dem
<link linkend="zend.loader.autoloader">autoloader</link> bei der Instanziierung registriert,
und zwar mit dem Namespace mit dem Sie assoziiert sind. Das erlaubt es Code in speziellen
Verzeichnissen zu namespacen, und trotzdem die Vorteile des Autoloadings zu nutzen.
</para>
<sect2 id="zend.loader.autoloader-resource.usage">
<title>Verwendung von Ressource Autoloadern</title>
<para>
Nehmen wir die folgende Verzeichnis Struktur an:
</para>
<programlisting language="text"><![CDATA[
path/to/some/directory/
acls/
Site.php
forms/
Login.php
models/
User.php
]]></programlisting>
<para>
In diesem Verzeichnis hat jeder Code ein Präfix mit dem Namespace "My_". Im
Unterverzeichnis "acls" ist der Komponentenpräfix "Acl_" hinzugefügt, was letztendlich
zu einem Klassennamen von "My_Acl_Site" führt. So ähnlich mappt das Unterverzeichnis
"forms" auf "Form_", was zu "My_Form_Login" führt. Das Unterverzeichnis "models" hat
keinen Komponenten Namespace, was zu "My_User" führt.
</para>
<para>
Man kann einen Ressource Autoloader verwenden um diese Klassen automatisch zu laden.
um den Ressource Autoloader zu instanziieren ist es mindestens notwendig den
Basispfad und den Namespace für die Ressourcen zu übergeben für die er verantwortlich
ist:
</para>
<programlisting language="php"><![CDATA[
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => 'path/to/some/directory',
'namespace' => 'My',
));
]]></programlisting>
<note>
<title>Basis Namespace</title>
<para>
In <classname>Zend_Loader_Autoloader</classname> wird erwartet das man den endenden
Unterstrich ("_") im Namespace angibt wenn der eigene Autoloader verwendet wird
um den Namespace zu suchen. <classname>Zend_Loader_Autoloader_Resource</classname>
nimmt an das alle Codes die man automatisch laden will ein Unterstrich Trennzeichen
zwischen Namespace, Komponente und Klasse verwenden. Als Ergebnis, muß man den
endenen Unterstrich nicht verwenden wenn ein Ressource Autoloader registriert wird.
</para>
</note>
<para>
Jetzt da wir den Basis Ressource Autoloader eingerichtet haben, können wir einige
Komponenten zu Ihm hinzufügen um die automatisch zu Laden. Das wird mit der
<methodname>addResourceType()</methodname> Methode getan, welche drei Argumente
akzeptiert: einen Ressource "type", der intern als Referenzname verwendet wird; den Pfad
des Unterverzeichnisses unter dem Basispfad in dem diese Ressource existiert; und den
Namespace der Komponente die dem Basis Namespace hinzugefügt wird. Als Beispiel fügen
wir jeden unserer Ressource Typen hinzu.
</para>
<programlisting language="php"><![CDATA[
$resourceLoader->addResourceType('acl', 'acls/', 'Acl')
->addResourceType('form', 'forms/', 'Form')
->addResourceType('model', 'models/');
]]></programlisting>
<para>
Alternativ können diese als Array an <methodname>addResourceTypes()</methodname>
übergeben werden; das folgende ist äquivalent zu dem obigen:
</para>
<programlisting language="php"><![CDATA[
$resourceLoader->addResourceTypes(array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
),
));
]]></programlisting>
<para>
Letztendlich kann alles davon spezifiziert werden wenn das Objekt instanziiert wird
indem einfach ein "resourceTypes" Schlüssel in den Optionen spezifiziert und übergeben
wird, sowie eine Struktur wie anbei:
</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/',
),
),
));
]]></programlisting>
</sect2>
<sect2 id="zend.loader.autoloader-resource.module">
<title>Der Modul Ressource Autoloader</title>
<para>
Zend Framework wird mit einer konkreten Implementation von
<classname>Zend_Loader_Autoloader_Resource</classname> ausgeliefert die Ressourcen Typen
enthält welche den notwendigen Standard Verzeichnisstrukturen für Zend Framework
<acronym>MVC</acronym> Anwendungen entsprechen. Diese Lader,
<classname>Zend_Application_Module_Autoloader</classname>, kommt mit den folgenden
Mappings:
</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>
Wenn man, als Beispiel, ein Modul mit dem Präfix "Blog_" hat, und die Klasse
"Blog_Form_Entry" instanziieren will, würde diese in den Ressourcen Verzeichnis
"forms/" im Unterverzeichnis nach einer Datei die "Entry.php" heißt suchen.
</para>
<para>
Wenn Modul Bootstraps mit <classname>Zend_Application</classname> verwendet werden, wird
standardmäßig eine Instanz von <classname>Zend_Application_Module_Autoloader</classname>
für jede eigene Modul erstellt, was es erlaubt Modul Ressource automatisch zu laden.
</para>
</sect2>
<sect2 id="zend.loader.autoloader-resource.factory">
<title>Verwendung von Ressource Autoloadern als Objekt Factories</title>
<para></para>
<!-- @todo -->
</sect2>
<sect2 id="zend.loader.autoloader-resource.reference">
<title>Referenz zu den Ressource Autoloadern</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>
|