Edit
Lang

Auto-loading tříd

Při práci s Nette Framework můžeme zapomenout na otravné vkládání každičkého souboru pomocí require či include. Framework dbá o naše pohodlí a udělá to za nás.

  • zbavíme se všech require
  • budou se načítat jen potřebné skripty
  • nevyžaduje se žádná striktní konvence pojmenování souborů
  • lze mít i více tříd v jednom souboru

Nette Framework načteme jedním příkazem require 'Nette/loader.php' (cesta samozřejmě může být jiná) a všechny jeho třídy se již budou načítat automaticky ve chvíli, kdy je poprvé použijete. Což vám ušetří nejen spoustu psaní nebo přemýšlení, ale také to výrazně zrychlí běh celé aplikace. Proč? Protože se načítají jen ty soubory, které jsou skutečně potřeba. Nehrozí, že by PHP parsovalo skripty, které se potom k ničemu nepoužijí.

Nette\Loaders\RobotLoader

Nette\Loaders\RobotLoader je nástroj, který vám zajistí komfort automatického načítání tříd pro celou vaši aplikaci včetně knihoven třetích stran. Můžeme tedy zapomenout na tyto známé bloky kódu:

require_once 'Zend/Pdf/Page.php';
require_once 'Zend/Pdf/Style.php';
require_once 'Zend/Pdf/Color/GrayScale.php';
require_once 'Zend/Pdf/Color/Cmyk.php';
...

Podobně, jako Google robot prochází a indexuje webové stránky, tak i RobotLoader prochází všechny PHP skripty a zaznamenává si, které třídy a rozhraní v nich našel. Výsledky bádání si poté uloží do cache a použije při dalším požadavku. Stačí tedy určit, které adresáře má procházet a kam ukládat cache:

$loader = new Nette\Loaders\RobotLoader;
// přidáme adresáře, které má RobotLoader indexovat
$loader->addDirectory('app');
$loader->addDirectory('libs');
// nastavíme cachování na disk do adresáře 'temp'
$loader->setCacheStorage(new Nette\Caching\Storages\FileStorage('temp'));
$loader->register(); // spustíme RobotLoader

A to je vše, od této chvíle nemusíme používat require. Paráda!

Pokud RobotLoader narazí při indexaci na duplicitní název třídy, vyhodí výjimku a informuje vás o tom.

Uvnitř sandboxu, kde jsou cesty k souborům aplikace a knihoven uloženy v konstantách APP_DIR & LIBS_DIR, lze zápis zjednodušit a přidat do zaváděcího souboru bootstrap.php:

$configurator = new Nette\Configurator;
...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
    ->addDirectory(APP_DIR)
    ->addDirectory(LIBS_DIR)
    ->register();

Proměnná $loader->autoRebuild určuje, zda má RobotLoader při dotazu na neexistující třídu znovu prozkoumat všechny skripty. Na produkčním serveru je tato vlastnost standardně vypnutá.

Proto je nutné při nahrání nové verze aplikace na web smazat cache.

Pokud chcete instruovat RobotLoader, aby některé adresáře přeskočil, vytvořte v příslušném adresáři soubor netterobots.txt:

Disallow: /Zend

Od této chvíle se nebude indexovat adresář Zend.

RobotLoader je nesmírně pohodlný a návykový!