RobotLoader: osztályok automatikus betöltése
A RobotLoader egy eszköz, amely biztosítja az osztályok automatikus betöltésének kényelmét az egész alkalmazás számára, beleértve a harmadik féltől származó könyvtárakat is.
- megszabadulunk minden
require
-től - csak a szükséges szkriptek töltődnek be
- nem igényel szigorú elnevezési konvenciókat a könyvtárakra vagy fájlokra
- rendkívül gyors
- nincs szükség a gyorsítótár kézi frissítésére, minden automatikusan történik
- érett, stabil és széles körben használt könyvtár
Tehát elfelejthetjük ezeket az ismert kódblokkokat:
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
// ...
Telepítés
A RobotLoadert letöltheti egy
önálló RobotLoader.php
fájlként, amelyet a require
segítségével beilleszt a szkriptjébe,
és máris rendelkezésére áll a kényelmes autoloading az egész alkalmazáshoz.
require '/path/to/RobotLoader.php';
$loader = new Nette\Loaders\RobotLoader;
// ...
Ha Composer-t használó alkalmazást épít, telepítheti vele:
composer require nette/robot-loader
Használat
Hasonlóan ahhoz, ahogy a Google robot végigjárja és indexeli a weboldalakat, a RobotLoader is végigmegy az összes PHP szkripten, és feljegyzi, mely osztályokat, interfészeket, traitteket és enumokat talált bennük. A kutatás eredményeit ezután a gyorsítótárba menti, és a következő kérésnél használja. Csak meg kell határozni, mely könyvtárakat kell átvizsgálnia, és hova mentse a gyorsítótárat:
$loader = new Nette\Loaders\RobotLoader;
// könyvtárak, amelyeket a RobotLoader indexeljen (beleértve az alkönyvtárakat is)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');
// beállítjuk a gyorsítótárazást a 'temp' könyvtárba
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // elindítjuk a RobotLoadert
És ennyi, ettől a pillanattól kezdve nem kell require
-t használnunk. Remek!
Ha a RobotLoader indexelés közben duplikált osztálynévre bukkan, kivételt dob, és tájékoztatja Önt erről. A RobotLoader automatikusan frissíti a gyorsítótárat is, amikor olyan osztályt kell betöltenie, amelyet nem ismer. Ezt javasoljuk kikapcsolni az éles szervereken, lásd #Gyorsítótárazás.
Ha azt szeretné, hogy a RobotLoader kihagyjon néhány könyvtárat, használja a
$loader->excludeDirectory('temp')
parancsot (többször is hívható, vagy több könyvtárat is átadhat).
Alapértelmezés szerint a RobotLoader a PHP fájlokban lévő hibákat a ParseError
kivétel dobásával jelenti.
Ezt a $loader->reportParseErrors(false)
segítségével lehet letiltani.
Nette alkalmazás
A Nette alkalmazáson belül, ahol az indítófájlban (Bootstrap.php
) a $configurator
objektumot
használjuk, a leírás egyszerűsíthető:
$configurator = new Nette\Bootstrap\Configurator;
// ...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
PHP fájl elemző
A RobotLoadert tisztán arra is lehet használni, hogy osztályokat, interfészeket, traitteket és enumokat keressen PHP fájlokban anélkül, hogy az autoloading funkciót használnánk:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// átvizsgálja a könyvtárakat osztályokra / interfészekre / traittekre / enumokra
$loader->rebuild();
// visszaad egy tömböt osztály => fájlnév párokkal
$res = $loader->getIndexedClasses();
Ilyen használat esetén is kihasználhatja a gyorsítótárat. Ennek köszönhetően az újbóli szkenneléskor a változatlan fájlok nem lesznek újra elemezve:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// beállítjuk a gyorsítótárazást a 'temp' könyvtárba
$loader->setTempDirectory(__DIR__ . '/temp');
// átvizsgálja a könyvtárakat a gyorsítótár használatával
$loader->refresh();
// visszaad egy tömböt osztály => fájlnév párokkal
$res = $loader->getIndexedClasses();
Gyorsítótárazás
A RobotLoader nagyon gyors, mert ügyesen használja a gyorsítótárat.
Fejlesztés közben gyakorlatilag észre sem vesszük, hogy a háttérben fut. Folyamatosan frissíti a gyorsítótárát, mert számít arra, hogy osztályok és fájlok keletkezhetnek, megszűnhetnek, átneveződhetnek stb. És nem szkenneli újra azokat a fájlokat, amelyek nem változtak.
Éles szerveren történő telepítéskor viszont javasoljuk a gyorsítótár frissítésének kikapcsolását a
$loader->setAutoRefresh(false)
segítségével (a Nette Alkalmazásban ez automatikusan megtörténik), mivel a
fájlok nem változnak. Ugyanakkor ilyenkor törölni kell a gyorsítótárat az új verzió hosztingra való
feltöltésekor.
A fájlok kezdeti szkennelése, amikor a gyorsítótár még nem létezik, természetesen eltarthat egy ideig a nagyobb alkalmazásoknál. A RobotLoader beépített védelemmel rendelkezik a cache stampede ellen. Ez egy olyan helyzet, amikor az éles szerveren nagyobb számú egyidejű kérés érkezik, amelyek elindítják a RobotLoadert, és mivel a gyorsítótár még nem létezik, mindegyik elkezdené szkennelni a fájlokat. Ez aránytalanul megterhelné a szervert. Szerencsére a RobotLoader úgy működik, hogy több egyidejű kérés esetén csak az első szál indexeli a fájlokat, létrehozza a gyorsítótárat, a többiek várnak, majd ezt a gyorsítótárat használják.
PSR-4
Ma már az autoloadinghoz a Composert használni
lehet a PSR-4 betartásával. Egyszerűsítve ez egy olyan rendszer, ahol a névterek és osztálynevek megfelelnek a
könyvtárstruktúrának és a fájlneveknek, tehát pl. az App\Core\RouterFactory
az
/path/to/App/Core/RouterFactory.php
fájlban lesz.
A RobotLoader nem kötődik semmilyen fix struktúrához, ezért olyan helyzetekben hasznos, amikor nem teljesen felel meg Önnek, hogy ugyanúgy tervezett könyvtárstruktúrája legyen, mint a PHP névtereknek, vagy amikor olyan alkalmazást fejleszt, amely történelmileg nem használ ilyen konvenciókat. Lehetőség van mindkét loader együttes használatára is.