Automatyczne ładowanie zasobów

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.

Zgodnie z celami autoloadera a zwłaszcza z ostatnim punktem, powyższa sytuacja jest obsługiwana przez autoloader Zend Framework poprzez Zend_Loader_Autoloader_Resource.

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:

$loader = new Zend_Application_Module_Autoloader(array(
    'namespace' => 'Blog',
    'basePath'  => APPLICATION_PATH . '/modules/blog',
));

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.

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

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

Pierwszym krokiem jest utworzenie autoloadera zasobów:

$loader = new Zend_Loader_Autoloader_Resource(array(
    'basePath'  => 'sciezka/do/zasobow/',
    'namespace' => 'Foo',
));

Następnie należy zdefiniować typy zasobów. Zend_Loader_Autoloader_Resourse::addResourceType() 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 "models/DbTable" z prefiksem "Model_DbTable"). Następujący przykład pokazuje sposób ich definiowania:

$loader->addResourceType('form', 'forms', 'Form')
       ->addResourceType('model', 'models', 'Model')
       ->addResourceType('dbtable', 'models/DbTable', 'Model_DbTable');

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

$form      = new Foo_Form_Guestbook();
$guestbook = new Foo_Model_Guestbook();

automatyczne ładowanie zasobu modułu

Implementacja wzorca projektowego MVC 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 zaleca standardową strukturę katalogów dla modułu. Autoloader zasobów staje się bardzo przydatny w tym kontekście. Przez to, jeśli umieści się plik z klasą bootstrap pochodną do Zend_Application_Module_Bootstrap to autoloader zostanie domyślnie włączony. Aby uzyskać więcej informacji należy zapoznać się z dokumentacją Zend_Loader_Autoloader_Module.