RobotLoader: Osztály automatikus betöltése

A RobotLoader egy olyan eszköz, amely kényelmet biztosít az automatikus osztálybetöltés számára a teljes alkalmazásod számára, beleértve a harmadik féltől származó könyvtárakat is.

  • megszabadul az összes require
  • csak a szükséges szkriptek töltődnek be
  • nem igényel szigorú könyvtár- vagy fájlnevezési konvenciókat

Tehát elfelejthetjük a híres kódblokkokat:

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

Telepítés

Töltse le és telepítse a csomagot a Composer segítségével:

composer require nette/robot-loader

Használat:

Ahogy a Google robot feltérképezi és indexeli a weboldalakat, a RobotLoader is feltérképezi az összes PHP szkriptet, és rögzíti, hogy milyen osztályokat és interfészeket találtak bennük. Ezek a rekordok a gyorsítótárba kerülnek, és minden későbbi lekérdezés során felhasználásra kerülnek. Csak azt kell megadni, hogy milyen könyvtárakat indexeljen és hova mentse a gyorsítótárat:

$loader = new Nette\Loaders\RobotLoader;

// a RobotLoader által indexelendő könyvtárak (beleértve az alkönyvtárakat is)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// 'temp' könyvtár használata a gyorsítótárhoz
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // RobotLoader futtatása

És ez minden. Mostantól kezdve nem kell a require címet használnod. Nagyszerű, nem igaz?

Ha a RobotLoader az indexelés során duplikált osztálynévvel találkozik, kivételt dob, és tájékoztatja Önt erről. A RobotLoader automatikusan frissíti a gyorsítótárat is, ha olyan osztályt kell betöltenie, amelyet nem ismer. Javasoljuk ennek kikapcsolását a produktív szervereken, lásd a Caching.

Ha azt szeretné, hogy a RobotLoader kihagyjon néhány könyvtárat, használja a $loader->excludeDirectory('temp') címet (többször is meghívható, vagy több könyvtárat is átadhat).

Alapértelmezés szerint a RobotLoader a PHP-fájlok hibáit a ParseError kivétel dobásával jelzi. Ez kikapcsolható a $loader->reportParseErrors(false) segítségével.

Nette alkalmazás

A Nette alkalmazáson belül, ahol a $configurator a Bootstrap.php oldalon található, a RobotLoader-t így állíthatja be:

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

PHP Files Analyzer

A RobotLoader használható pusztán osztályok, interfészek és tulajdonságok keresésére is a PHP fájlokban az automatikus betöltés funkció használata nélkül:

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

// Átvizsgálja a könyvtárakat osztályok / interfészek / tulajdonságok után.
$loader->rebuild();

// Visszaadja az osztály => fájlnév párok tömbjét.
$res = $loader->getIndexedClasses();

Ilyen használat esetén is használhatja a gyorsítótárat. Ennek eredményeképpen a nem módosított fájlok nem kerülnek ismételten elemzésre az újbóli szkennelés során:

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

// Könyvtárak keresése a gyorsítótár segítségével
$loader->refresh();

// Visszaadja az osztály => fájlnév párok tömbjét.
$res = $loader->getIndexedClasses();

Tárolás

A RobotLoader nagyon gyors, mert okosan használja a gyorsítótárat.

A vele való fejlesztés során gyakorlatilag fogalmad sincs arról, hogy a háttérben fut. Folyamatosan frissíti a gyorsítótárat, mert tudja, hogy osztályokat és fájlokat lehet létrehozni, törölni, átnevezni stb. És nem vizsgálja ismételten a nem módosított fájlokat.

Termelőszervereken való használat esetén viszont javasoljuk, hogy a $loader->setAutoRefresh(false) segítségével tiltsuk le a gyorsítótár frissítését (ez automatikusan megtörténik a Nette alkalmazásban), mert a fájlok nem változnak. Ugyanakkor a tárhelyre történő új verzió feltöltésekor tisztítani kell a gyorsítótárat.

Természetesen a fájlok kezdeti beolvasása, ha a gyorsítótár még nem létezik, nagyobb alkalmazásoknál néhány másodpercig is eltarthat. A RobotLoader beépített megelőzéssel rendelkezik a cache stampede ellen. Ez az a helyzet, amikor a termelő szerver nagyszámú egyidejű kérést kap, és mivel a RobotLoader gyorsítótár még nem létezik, mindegyik elkezdené a fájlok beolvasását. Ami megnöveli a CPU és a fájlrendszer használatát. 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 használják a gyorsítótárat.

PSR-4

A Composer ma már a PSR-4 szabványnak megfelelően használható automatikus betöltésre. Egyszerűen fogalmazva, ez egy olyan rendszer, ahol a névterek és az osztálynevek megfelelnek a könyvtárszerkezetnek és a fájlneveknek, azaz a App\Router\RouterFactory a /path/to/App/Router/RouterFactory.php fájlban található.

A RobotLoader nem kötődik semmilyen rögzített struktúrához, ezért hasznos olyan helyzetekben, amikor nem felel meg a PHP-ban névterekként kialakított könyvtárszerkezet, vagy amikor olyan alkalmazást fejlesztünk, amely történelmileg nem használ ilyen konvenciókat. Az is lehetséges, hogy mindkét betöltőt együtt használjuk.

verzió: 4.0