<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="learning.autoloading.resources">
    <title>Automatisches Laden von Ressourcen</title>

    <para>
        Oft ist es kompliziert, wenn eine Anwendung entwickelt wird, Klassen in den 1:1
        Klassenname:Dateiname Standard zu packen welchen der Zend Framework empfiehlt, oder es
        hat Vorteile für Zwecke des Packens das nicht zu tun. Das bedeutet aber das die eigenen
        Klassendateien nicht vom Autoloader gefunden werden.
    </para>

    <para>
        Wenn man <link linkend="learning.autoloading.design">die Design Ziele</link> für den
        Autoloader durchliest, zeigt der letzte Punkt in diesem Kapitel das die Lösung diese
        Situation abdecken könnte. Zend Framework macht das mit der
        <classname>Zend_Loader_Autoloader_Resource</classname>.
    </para>

    <para>
        Eine Ressource ist nur ein Name der mit dem Namespace einer Komponente korrespondiert
        (welche dem Namespace des Autoloaders angehängt wird) und einem Pfad (der relativ zum
        Basispfad des Autoloaders ist). In Aktion könnte man etwas wie folgt machen:
    </para>

    <programlisting language="php"><![CDATA[
$loader = new Zend_Application_Module_Autoloader(array(
    'namespace' => 'Blog',
    'basePath'  => APPLICATION_PATH . '/modules/blog',
));
]]></programlisting>

    <para>
        Sobald der Loader platziert ist, muss man Ihn über die verschiedenen Ressource Typen
        informieren die er beachten soll. Dieser Ressource Typen sind einfach Paare von
        Unterverzeichnis und Präfix.
    </para>

    <para>
        Nehmen wir als Beispiel den folgenden Baum:
    </para>

    <programlisting language="text"><![CDATA[
path/to/some/resources/
|-- forms/
|   `-- Guestbook.php        // Foo_Form_Guestbook
|-- models/
|   |-- DbTable/
|   |   `-- Guestbook.php    // Foo_Model_DbTable_Guestbook
|   |-- Guestbook.php        // Foo_Model_Guestbook
|   `-- GuestbookMapper.php  // Foo_Model_GuestbookMapper
]]></programlisting>

    <para>
        Unser erster Schritt ist die Erstellung des Ressource Loaders:
    </para>

    <programlisting language="php"><![CDATA[
$loader = new Zend_Loader_Autoloader_Resource(array(
    'basePath'  => 'path/to/some/resources/',
    'namespace' => 'Foo',
));
]]></programlisting>

    <para>
        Als nächstes müssen wir einige Ressource Typen definieren.
        <methodname>Zend_Loader_Autoloader_Resourse::addResourceType()</methodname> hat drei
        Argumente: den Typ ("type") der Ressource (ein eigener String), den Pfad unter dem Basispfad
        in dem der Ressource Typ gefunden werden kann, und der Präfix der Komponente welcher für den
        Ressource Typ zu verwenden ist. Im obigen Baum haben wir drei Ressource Typen: form
        (im Unterverzeichnis "forms", mit dem Komponenten Präfix "Form"), model (im Unterverzeichnis
        "models", mit dem Komponenten Präfix "Model"), und dbtable (im Unterverzeichnis
        "<filename>models/DbTable</filename>", mit dem Komponenten Präfix
        "<classname>Model_DbTable</classname>"). Wir definieren Sie wie folgt:
    </para>

    <programlisting language="php"><![CDATA[
$loader->addResourceType('form', 'forms', 'Form')
       ->addResourceType('model', 'models', 'Model')
       ->addResourceType('dbtable', 'models/DbTable', 'Model_DbTable');
]]></programlisting>

    <para>
        Sobald Sie definiert sind, können diese Klassen einfach verwendet werden:
    </para>

    <programlisting language="php"><![CDATA[
$form      = new Foo_Form_Guestbook();
$guestbook = new Foo_Model_Guestbook();
]]></programlisting>

    <note>
        <title>Modul Ressource Autoloading</title>

        <para>
            Zend Framework's <acronym>MVC</acronym> Layer empfiehlt die Verwendung von "Modulen",
            welche eigenständigt Anwendungen in der eigenen Site sind. Typischerweise haben Module
            standardmäßig eine Anzahl von Ressource Typen, und Zend Framework
            <link linkend="project-structure.filesystem">empfiehlt sogar ein Standard Verzeichnis
                Layout für Module</link>. Ressource Autoloader sind deshalb recht nützlich in diesem
            Paradigma -- so nützlich das Sie standardmäßig aktiviert sind wenn man eine Bootstrap
            Klasse für eigene Module erstellt welche
            <classname>Zend_Application_Module_Bootstrap</classname> erweitert. Für weitere
            Informationen kann in der <link
                linkend="zend.loader.autoloader-resource.module">Zend_Loader_Autoloader_Module
                Dokumentation</link> nachgelesen werden.
        </para>
    </note>
</sect1>
