<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="learning.autoloading.resources">
    <title>Automatyczne ładowanie zasobów</title>

    <para>
        Często, podczas tworzenia aplikacji, zachowanie zalecanego przez Zend Framework standardu
        dotyczącego utrzymania stosunku 1:1 pomiędzy klasami a plikami jest trudne bądź niekorzystne
        z punktu widzenia wydajności. To oznacza, że pliki z klasami nie zostaną odnalezione przez
        autoloader.
    </para>

    <para>
        Zgodnie z <link linkend="learning.autoloading.design">celami autoloadera</link> a zwłaszcza
        z ostatnim punktem, powyższa sytuacja jest obsługiwana przez autoloader Zend Framework
        poprzez <classname>Zend_Loader_Autoloader_Resource</classname>.
    </para>

    <para>
        Zasób to jedynie nazwa odpowiadająca przestrzeni nazw komponentu (dołączona do przestrzeni
        nazw autoloadera) wraz ze ścieżką (relatywnie do ścieżki bazowej autoloadera). W praktyce
        można użyć następującego kodu:
    </para>

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

    <para>
        Po włączeniu autoloadera należy "poinformować" go o typach zasobów, które powinien dołączać.
        Są to, po prostu, pary względnych ścieżek oraz prefiksów.
    </para>

    <para>
        Jako przykład może posłużyć następujące drzewo katalogów:
    </para>

    <programlisting language="text"><![CDATA[
sciezka/do/zasobow/
|-- 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>
        Pierwszym krokiem jest utworzenie autoloadera zasobów:
    </para>

    <programlisting language="php"><![CDATA[
$loader = new Zend_Loader_Autoloader_Resource(array(
    'basePath'  => 'sciezka/do/zasobow/',
    'namespace' => 'Foo',
));
]]></programlisting>

    <para>
        Następnie należy zdefiniować typy zasobów.
        <methodname>Zend_Loader_Autoloader_Resourse::addResourceType()</methodname> przyjmuje trzy
        argumenty: typ zasobu (dowolny łańcuch znaków), ścieżka relatywna do
        ścieżki bazowej autoloadera, w której zasób się znajduje oraz prefiks używany przez dany typ
        zasobu. W powyższym przykładzie istnieją trzy rodzaje zasobów: formularze (w katalogu
        "forms" z prefiksem "Form"), modele (w katalogu "models" z prefiksem "Model") oraz modele
        tabeli bazy danych (w katalogu "<filename>models/DbTable</filename>" z prefiksem
        "<classname>Model_DbTable</classname>"). Następujący przykład pokazuje sposób ich
        definiowania:
    </para>

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

    <para>
        Po zdefiniowaniu, można używać tych klas bez ręcznego dołączania:
    </para>

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

    <note>
        <title>automatyczne ładowanie zasobu modułu</title>

        <para>
            Implementacja wzorca projektowego <acronym>MVC</acronym> w Zend Framework zachęca do
            używania modułów, które są mini-aplikacjami w ramach tworzonego programu. Moduły
            przeważnie posiadają wiele typów zasobów a Zend Framework nawet 
            <link linkend="project-structure.filesystem">zaleca standardową strukturę katalogów
            dla modułu</link>. Autoloader zasobów staje się bardzo przydatny w tym kontekście.
            Przez to, jeśli umieści się plik z klasą bootstrap pochodną do
            <classname>Zend_Application_Module_Bootstrap</classname> to autoloader zostanie
            domyślnie włączony. Aby uzyskać więcej informacji należy zapoznać się z 
            <link linkend="zend.loader.autoloader-resource.module"> dokumentacją
            Zend_Loader_Autoloader_Module</link>.
        </para>
    </note>
</sect1>
