RobotLoader: Samodejno nalaganje razreda
RobotLoader je orodje, ki omogoča samodejno nalaganje razredov za celotno aplikacijo, vključno s knjižnicami tretjih oseb.
- Odpravite vse izjave
require
- Nalagali se bodo samo potrebni skripti
- Ne zahteva strogih poimenovalnih konvencij za imenike ali datoteke
- Izjemno hitro
- Ni ročnih posodobitev predpomnilnika, vse poteka samodejno
- Zrela, stabilna in široko uporabljena knjižnica
Tako lahko pozabimo na te znane bloke kode:
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
//...
Namestitev
RobotLoader lahko prenesete kot eno samostojno datoteko
RobotLoader.php
, ki jo s pomočjo require
vključite v svojo skripto, in takoj uživate v udobnem
samodejnem nalaganju za celotno aplikacijo.
require '/path/to/RobotLoader.php';
$loader = new Nette\Loaders\RobotLoader;
//...
Če gradite aplikacijo z uporabo programa Composer, ga lahko namestite prek:
composer require nette/robot-loader
Uporaba
Podobno kot robot Google preiskuje in indeksira spletne strani, RobotLoader pregleda vse skripte PHP in zapiše, katere razrede, vmesnike, lastnosti in enume je našel. Rezultate nato shrani v predpomnilnik za uporabo pri naslednjih zahtevah. Določiti morate le, katere imenike naj pregleda in kje naj shrani predpomnilnik:
$loader = new Nette\Loaders\RobotLoader;
// imeniki za indeksiranje RobotLoaderja (vključno s podimeniki)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');
// Nastavitev predpomnjenja na imenik 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Aktivirajte RobotLoader
In to je to, od te točke naprej nam ni treba več uporabljati require
. Odlično!
Če RobotLoader med indeksiranjem naleti na podvojeno ime razreda, bo vrgel izjemo in vas o tem obvestil. RobotLoader tudi samodejno posodobi predpomnilnik, kadar mora naložiti neznan razred. Priporočamo, da to izklopite na produkcijskih strežnikih, glejte Predpomnilnik.
Če želite, da RobotLoader preskoči določene 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 odpravite
z uporabo $loader->reportParseErrors(false)
.
Neto aplikacija
Znotraj aplikacije Nette Application, 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();
Analizator datotek PHP
RobotLoader lahko uporabite tudi za iskanje razredov, vmesnikov, lastnosti in enumov v datotekah PHP, ne da bi uporabili funkcijo samodejnega nalaganja:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Pregleduje imenike za razrede/interfaces/traits/enums
$loader->rebuild();
// Vrne polje parov razred => ime datoteke
$res = $loader->getIndexedClasses();
Tudi pri takšni uporabi lahko uporabite predpomnjenje. To zagotavlja, da se nespremenjene datoteke ne bodo ponovno iskale:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Nastavite predpomnjenje v imenik 'temp'
$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 predpomnjenje.
Med razvojem skoraj ne opazite, da teče v ozadju. Svoj predpomnilnik nenehno posodablja, saj upošteva, da se razredi in datoteke lahko ustvarjajo, brišejo, preimenujejo itd. Nespremenjenih datotek ne pregleduje ponovno.
V produkcijskem strežniku pa priporočamo, da posodobitve predpomnilnika izklopite z uporabo spletne strani
$loader->setAutoRefresh(false)
(v aplikaciji Nette se to zgodi samodejno), saj se datoteke ne spreminjajo. Hkrati
je treba izbrisati predpomnilnik ob prenosu nove različice na gostovanje.
Začetno pregledovanje datotek, ko predpomnilnik še ne obstaja, lahko pri večjih aplikacijah seveda traja nekaj časa. RobotLoader ima vgrajeno preprečevanje stampeda predpomnilnika. To je situacija, ko bi veliko število hkratnih zahtevkov v produkcijskem strežniku sprožilo RobotLoader, in ker predpomnilnik še ne obstaja, bi vsi začeli pregledovati datoteke, kar bi preobremenilo strežnik. Na srečo RobotLoader deluje tako, da samo prva nit indeksira datoteke in ustvari predpomnilnik, ostale pa počakajo in nato uporabijo predpomnilnik.
PSR-4
Danes lahko za samodejno nalaganje uporabljate program Composer in
hkrati upoštevate PSR-4. Preprosto povedano, gre za sistem, v katerem imenska območja in imena razredov ustrezajo imeniški
strukturi in imenom datotek, npr. App\Core\RouterFactory
bo v datoteki
/path/to/App/Core/RouterFactory.php
.
RobotLoader ni vezan na nobeno fiksno strukturo, zato je uporaben v primerih, ko ne želite, da bi bila struktura imenikov zasnovana povsem enako kot imenski prostori PHP, ali pri razvoju aplikacije, ki v preteklosti ni uporabljala takšnih konvencij. Oba nalagalnika je mogoče uporabljati tudi skupaj.