V nové verzi Zend Frameworku 1.8 došlo k významné změně v práci s automatickým nahráváním tříd do projektu. Dříve jsme byli zvyklí, že na začátku bootstrapu se zavolala metoda Zend_Loader::registerAutoload(), která dokázala nahrávat třídy s přesně daným prefixem za nás. Tato možnost je i v nové verzi k dispozici, je však označena jako zavržená a ve verzi 2.0 bude definitivně odstraněna.

V nové verzi Zend Frameworku máme k dispozici třídu Zend_Loader_Autoload, která je implementací rozhraní Zend_Loader_Autoload_Interface s jedinou povinnou metodou autoload(). Tato třída je singleton, v souladu s konvencemi pojmenování má tedy i dostupnou metodu getInstance().

Při vytvoření instance se zaregistrují prefixy Zend_ a ZendX_ pro knihovny Zend Frameworku. Chcete-li zaregistrovat vlastní jmenný prostor, pak použijete metodu registerNamespace(). Při registraci v tomto případě použijte i podtržítko.

<?php
$instance = Zend_Loader_Autoloader::getInstance();
$instance->registerNamespace(‚Interval_‘);

Pokud nyní zavoláte např. třídu Interval_Class, pak se bude hledat soubor Interval/Class.php uvnitř cest, které jste nastavili přes funkci set_include_path() před voláním autoloadu.

Někdy se stane, že použijete v projektu třídu nebo knihovnu jiného frameworku, který nesplňuje konvence Zend Frameworku, má však definován vlastní autoload pro nahrávání tříd. Tehdy se vám bude hodit metoda pushAutoloader(). Jako první parametr se předá metoda autoloaderu a jako druhý parametr prefix, pro který se autoload použije.

<?php
$instance->pushAutoloader(array(‚ezcBase‘, ‚autoload‘), ‚ezc‘);
$graph = new ezcGraphPieChart();
$graph->title = ‚Access statistics‘;

Nový autoloader obsahuje několik dalších zajímavých metod. Metoda unshiftAutloader() je alternativa k pushAutoloader(), která přidá předaný autoloader na první místo. Budete-li tedy mít již autoloader pro daný jmenný prostor a budete chtít před ním volat jiný autoloader, použijete tuto metodu.

Metoda suppressNotFoundWarnings() nastavuje, zda nevyhodit výjimku v případě, že se danou třídu nepodaří nahrát (ve výchozí podobě je tato volba zapnutá, tzn., že pokud dojde k vyhození výjimky při nahrávání třídy, bude potlačena).

Pokud chceme použít autoloader pro jakýkoliv jmenný prostor, pak nám pomůže metoda setFallbackAutoloader(). Taková volba se hodí např. pro nahrávání tříd z PEAR knihovny, která nemá jednotný jmenný prostor.

Někdy se stane, že umístění tříd, které bychom chtěli nahrát do projektu přesně nesplňují namapování v hieararchie adresářu k jejich názvům. V takovém případě je vám k dispozici třída Zend_Loader_Autoloader_Resource, která je rovněž implementací rozhraní pro autoloadery.

Jako příklad si uveďme nahrávání modelů a formulářů. Každý model i formulář je samostatná třída umístěná uvnitř adresáře models nebo forms. Oba tyto adresáře jsou pak uvnitř nějaké cesty /cesta/k/adresari/. Formulář pro editaci uživatele chceme umístit do adresáře /cesta/k/adresari/forms/Uzivatel.php a chceme, aby třída měla název Interval_Form_Uzivatel.

Nejprve vytvořte instanci autoloadu, zaregistrujte cestu (volba basePath) a určete jmenný prostor (volba namespace):

<?php
$instance = new Zend_Loader_Autoloader_Resource(array(
  ‚basePath‘ => ‚cesta/k/nejakemu/aresari‘,
  ‚namespace‘ => ‚Interval‘,
));

Následně zaregistrujte typ nahrávaného souboru (v našem případě forms a models):

<?php
$instance->addResourceTypes(array(
  ‚form‘ => array(
    ‚path‘ => ‚forms/‘,
    ‚namespace‘ => ‚Form‘,
  ),
  ‚model‘ => array(
    ‚path‘ => ‚models/‘,
  ),
));

Nakonec ještě dodejme, že verze 1.8 obsahuje mimo jiné i knihovnu Zend_Application a její třídu Zend_Application_Module_Autoloader, která přednastavuje různé typy podle doporučené struktury aplikace postavené na Zend Frameworku (dbTable, form, model, plugin, service, viewhelper, viewfilter).

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět