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.