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.

verzió: 4.0