RobotLoader: клас Autoloader
RobotLoader е инструмент, който осигурява автоматично зареждане на класове за цялото приложение, включително библиотеки на трети страни.
- да се отървете от всички
require
- зареждат се само необходимите скриптове
- не изисква строги конвенции за именуване на директориите или файловете.
Така че можем да забравим за известните блокове от код:
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
// ...
Инсталиране на
Можете да изтеглите RobotLoader като един самостоятелен
файл RobotLoader.php
, който можете да включите в скрипта си с помощта
на require
, и веднага да разполагате с удобно автоматично зареждане
за цялото си приложение:
require '/path/to/RobotLoader.php';
$loader = new Nette\Loaders\RobotLoader;
// ...
Ако изграждате приложение, което използва Composer, можете да го инсталирате чрез него:
composer require nette/robot-loader
Използване на
По същия начин, по който Google претърсва и индексира уебсайтове, RobotLoader преглежда всички PHP скриптове и записва кои класове и интерфейси са открити в тях. След това тези записи се кешират и се използват при всяко следващо търсене. Трябва само да посочите кои директории да се индексират и къде да се съхранява кешът:
$loader = new Nette\Loaders\RobotLoader;
// директории, които да бъдат индексирани от RobotLoader (включително поддиректории)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');
// използвайте директория 'temp' за кеша
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Стартиране на RobotLoader
И това е всичко. Отсега нататък не е необходимо да използвате
require
. Чудесно, нали?
Когато RobotLoader срещне дублирано име на клас по време на индексирането, той хвърля изключение и ви уведомява за това. RobotLoader също така автоматично актуализира кеша си, когато трябва да зареди клас, който не познава. Препоръчваме да забраните това на производствени сървъри, вижте раздел Кеширане.
Ако искате RobotLoader да пропусне някои директории, използвайте
$loader->excludeDirectory('temp')
(може да се извика многократно или да се
предадат няколко директории).
По подразбиране RobotLoader съобщава за грешки в PHP файловете, като хвърля
изключение ParseError
. Това може да бъде деактивирано с помощта на
$loader->reportParseErrors(false)
.
Приложение Nette
В рамките на приложението Nette, където $configurator
се използва в
Bootstrap.php
, можете да конфигурирате RobotLoader по този начин:
$configurator = new Nette\Bootstrap\Configurator;
// ...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
PHP файлов анализатор
RobotLoader може да се използва и само за намиране на класове, интерфейси и черти в PHP файлове **без да се използва функцията за автоматично зареждане:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Търсене на директории за класове / интерфейси / черти
$loader->rebuild();
//връща масив от двойки клас => име на файл
$res = $loader->getIndexedClasses();
Дори и при тази употреба можете да използвате кеша. В резултат на това немодифицираните файлове няма да бъдат анализирани отново при повторно сканиране:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
$loader->setTempDirectory(__DIR__ . '/temp');
// Сканиране на директории с кеш
$loader->refresh();
// Връща масив от двойки клас => име на файл
$res = $loader->getIndexedClasses();
Кеширане
RobotLoader е много бърз, защото използва кеша интелигентно.
Когато разработвате с него, почти не забелязвате, че работи във фонов режим. Той постоянно актуализира кеша, защото знае, че класовете и файловете могат да бъдат създавани, изтривани, преименувани и т.н. И не сканира повторно немодифицирани файлове.
От друга страна, когато се използва в производствен сървър,
препоръчваме да забраните актуализирането на кеша с
$loader->setAutoRefresh(false)
(това се прави автоматично в приложението
Nette), тъй като файловете не се модифицират. В същото време трябва да
изчистите кеша, когато качвате нова версия на хоста.
Разбира се, първоначалното сканиране на файловете, когато кешът все още не съществува, може да отнеме няколко секунди при по-големи приложения. RobotLoader разполага с вградена защита срещу препускане на кеша. Това е ситуация, в която производствен сървър получава голям брой едновременни заявки и тъй като кешът на RobotLoader все още не съществува, всички те започват да сканират за файлове. Това увеличава натоварването на процесора и файловата система. За щастие RobotLoader работи по такъв начин, че ако има няколко едновременни заявки, само първата нишка индексира файловете, създава кеш, а останалите изчакват, след което използват кеша.
PSR-4
Днес Composer може да се използва за автоматично зареждане в
съответствие с PSR-4. Казано по-просто, това е система, в която
пространствата от имена и имената на класовете съответстват на
структурата на директориите и имената на файловете, т.е.
App\Router\RouterFactory
е във файла /path/to/App/Router/RouterFactory.php
.
RobotLoader не е обвързан с никаква фиксирана структура, така че е полезен в ситуации, в които не искате структурата на директориите да бъде представена от пространствата от имена на PHP или когато разработвате приложение, което в миналото не е използвало тези конвенции. Можете също така да използвате и двете зареждащи устройства заедно.