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.