RobotLoader: Samodejno nalaganje razreda

RobotLoader je orodje, ki omogoča samodejno nalaganje razredov za celotno aplikacijo, vključno s knjižnicami tretjih oseb.

  • znebite se vseh require
  • naložijo se samo potrebni skripti
  • ne zahteva strogih konvencij za poimenovanje imenikov ali datotek

Zato lahko pozabimo na tiste znamenite bloke kode:

require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
// ...

Namestitev

Prenesite in namestite paket s programom Composer:

composer require nette/robot-loader

Uporaba

Podobno kot robot Google preiskuje in indeksira spletna mesta, RobotLoader preiskuje vse skripte PHP in beleži, katere razrede in vmesnike je našel v njih. Ti zapisi se nato shranijo v predpomnilnik in uporabijo pri vseh naslednjih zahtevah. Določiti morate le, katere imenike indeksirati in kam shraniti predpomnilnik:

$loader = new Nette\Loaders\RobotLoader;

// imeniki, ki jih bo indeksiral RobotLoader (vključno s podimeniki).
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// uporabite imenik 'temp' za predpomnilnik
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Zaženite RobotLoader

In to je vse. Od zdaj naprej vam ni treba več uporabljati require. Super, kajne?

Ko RobotLoader med indeksiranjem naleti na podvojeno ime razreda, vrže izjemo in vas o tem obvesti. RobotLoader tudi samodejno posodobi predpomnilnik, kadar mora naložiti razred, ki ga ne pozna. Priporočamo, da to onemogočite v produkcijskih strežnikih, glejte poglavje Predpomnilnik.

Če želite, da RobotLoader preskoči nekatere imenike, uporabite $loader->excludeDirectory('temp') (lahko ga pokličete večkrat ali posredujete več imenikov).

Privzeto RobotLoader poroča o napakah v datotekah PHP tako, da vrže izjemo ParseError. To lahko onemogočite prek $loader->reportParseErrors(false).

Nette aplikacija

Znotraj aplikacije Nette, kjer se $configurator uporablja v Bootstrap.php, lahko RobotLoader nastavite na ta način:

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

PHP Files Analyzer

RobotLoader lahko uporabite tudi za iskanje razredov, vmesnikov in lastnosti v datotekah PHP, ne da bi uporabili funkcijo samodejnega nalaganja:

$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');

// Pregledovanje imenikov za razrede / vmesnike / lastnosti
$loader->rebuild();

// Vrne polje parov razred => ime datoteke
$res = $loader->getIndexedClasses();

Tudi pri takšni uporabi lahko uporabite predpomnilnik. Zaradi tega se nespremenjene datoteke pri ponovnem iskanju ne bodo večkrat analizirale:

$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
$loader->setTempDirectory(__DIR__ . '/temp');

// Pregleduje imenike z uporabo predpomnilnika
$loader->refresh();

// Vrne polje parov razred => ime datoteke
$res = $loader->getIndexedClasses();

Predpomnilnik

RobotLoader je zelo hiter, ker pametno uporablja predpomnilnik.

Pri razvijanju z njim praktično ne veste, da deluje v ozadju. Sprotno posodablja predpomnilnik, saj ve, da se razredi in datoteke lahko ustvarjajo, brišejo, preimenujejo itd. In ne pregleduje nespremenjenih datotek večkrat.

Pri uporabi v produkcijskem strežniku pa priporočamo, da posodobitev predpomnilnika onemogočite z uporabo spletne strani $loader->setAutoRefresh(false) (to se samodejno izvede v aplikaciji Nette), saj se datoteke ne spreminjajo. Hkrati je treba izbrisati predpomnilnik ob prenosu nove različice na gostovanje.

Seveda lahko začetno pregledovanje datotek, ko predpomnilnik še ne obstaja, pri večjih aplikacijah traja nekaj sekund. RobotLoader ima vgrajeno preprečevanje stampeda predpomnilnika. To je situacija, ko produkcijski strežnik prejme veliko število hkratnih zahtevkov in ker predpomnilnik RobotLoader še ne obstaja, bi vsi začeli skenirati datoteke. To poveča porabo procesorja in datotečnega sistema. Na srečo RobotLoader deluje tako, da pri več hkratnih zahtevah le prva nit indeksira datoteke, ustvari predpomnilnik, druge počakajo in nato uporabijo predpomnilnik.

PSR-4

Danes se lahko program Composer uporablja za samodejno polnjenje v skladu s PSR-4. Preprosto povedano, gre za sistem, v katerem imenska območja in imena razredov ustrezajo imeniški strukturi in imenom datotek, tj. App\Router\RouterFactory se nahaja v datoteki /path/to/App/Router/RouterFactory.php.

RobotLoader ni vezan na nobeno fiksno strukturo, zato je uporaben v primerih, ko vam ne ustreza, da je struktura imenikov zasnovana kot imenski prostori v PHP, ali ko razvijate aplikacijo, ki v preteklosti ni uporabljala takih konvencij. Oba nalagalnika je mogoče uporabljati tudi skupaj.

različica: 4.0