RobotLoader: Klasse Autoloading

RobotLoader ist ein Tool, das Ihnen den Komfort des automatischen Ladens von Klassen für Ihre gesamte Anwendung einschließlich der Bibliotheken von Drittanbietern bietet.

  • alle loswerden require
  • nur notwendige Skripte werden geladen
  • erfordert keine strengen Verzeichnis- oder Dateinamenskonventionen

Wir können also diese berühmten Codeblöcke vergessen:

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

Installation

Laden Sie das Paket herunter und installieren Sie es mit Composer:

composer require nette/robot-loader

Verwendung

Ähnlich wie der Google-Roboter Webseiten crawlt und indiziert, crawlt RobotLoader alle PHP-Skripte und zeichnet auf, welche Klassen und Schnittstellen in ihnen gefunden wurden. Diese Aufzeichnungen werden dann im Cache gespeichert und bei allen nachfolgenden Anfragen verwendet. Sie müssen nur angeben, welche Verzeichnisse indiziert werden sollen und wo der Cache gespeichert werden soll:

$loader = new Nette\Loaders\RobotLoader;

// Verzeichnisse, die von RobotLoader indiziert werden sollen (einschließlich Unterverzeichnisse)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// 'temp' Verzeichnis für Cache verwenden
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Starten Sie den RobotLoader

Und das ist alles. Von nun an brauchen Sie require nicht mehr zu verwenden. Toll, nicht wahr?

Wenn RobotLoader bei der Indizierung auf doppelte Klassennamen stößt, löst er eine Ausnahme aus und informiert Sie darüber. RobotLoader aktualisiert auch automatisch den Cache, wenn er eine Klasse laden muss, die er nicht kennt. Wir empfehlen, dies auf Produktionsservern zu deaktivieren, siehe Caching.

Wenn Sie möchten, dass RobotLoader einige Verzeichnisse überspringt, verwenden Sie $loader->excludeDirectory('temp') (es kann mehrfach aufgerufen werden oder Sie können mehrere Verzeichnisse übergeben).

Standardmäßig meldet RobotLoader Fehler in PHP-Dateien, indem er die Ausnahme ParseError auslöst. Sie kann über $loader->reportParseErrors(false) deaktiviert werden.

Nette Anwendung

Innerhalb der Nette-Anwendung, wo $configurator in Bootstrap.php verwendet wird, können Sie RobotLoader auf diese Weise einrichten:

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

PHP-Dateianalysator

RobotLoader kann auch verwendet werden, um Klassen, Interfaces und Traits in PHP-Dateien zu finden ohne die Autoloading-Funktion zu verwenden:

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

// Durchsucht Verzeichnisse nach Klassen / Schnittstellen / Traits
$loader->rebuild();

// Gibt Array von Klasse => Dateinamenpaaren zurück
$res = $loader->getIndexedClasses();

Auch bei einer solchen Verwendung können Sie den Cache nutzen. Dadurch werden unveränderte Dateien beim erneuten Scannen nicht wiederholt analysiert:

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

// Scannt Verzeichnisse mit Hilfe eines Caches
$loader->refresh();

// Rückgabe eines Arrays von Klasse => Dateinamenpaaren
$res = $loader->getIndexedClasses();

Caching

RobotLoader ist sehr schnell, weil er den Cache geschickt nutzt.

Wenn Sie mit ihm entwickeln, bemerken Sie praktisch nicht, dass er im Hintergrund läuft. Der Cache wird ständig aktualisiert, da er weiß, dass Klassen und Dateien erstellt, gelöscht, umbenannt usw. werden können. Und es scannt nicht wiederholt unveränderte Dateien.

Beim Einsatz auf einem Produktionsserver empfiehlt es sich hingegen, die Cache-Aktualisierung mit $loader->setAutoRefresh(false) zu deaktivieren (dies geschieht automatisch in der Nette-Anwendung), da sich die Dateien nicht ändern. Gleichzeitig ist es notwendig, den Cache zu leeren, wenn eine neue Version auf das Hosting hochgeladen wird.

Natürlich kann das anfängliche Scannen von Dateien, wenn der Cache noch nicht vorhanden ist, bei größeren Anwendungen einige Sekunden dauern. RobotLoader verfügt über einen eingebauten Schutz gegen Cache-Stampede. Dabei handelt es sich um eine Situation, in der der Produktionsserver eine große Anzahl gleichzeitiger Anfragen erhält, und da der Cache von RobotLoader noch nicht vorhanden ist, würden alle mit dem Scannen der Dateien beginnen. Dies führt zu einer hohen CPU- und Dateisystemauslastung. Glücklicherweise funktioniert RobotLoader so, dass bei mehreren gleichzeitigen Anfragen nur der erste Thread die Dateien indiziert und einen Cache erstellt, die anderen warten und verwenden dann den Cache.

PSR-4

Heute kann Composer für das Autoloading gemäß PSR-4 verwendet werden. Einfach gesagt handelt es sich um ein System, bei dem die Namensräume und Klassennamen der Verzeichnisstruktur und den Dateinamen entsprechen, d.h. App\Router\RouterFactory befindet sich in der Datei /path/to/App/Router/RouterFactory.php.

RobotLoader ist nicht an eine feste Struktur gebunden und ist daher in Situationen nützlich, in denen die Verzeichnisstruktur in PHP nicht als Namespaces ausgelegt ist, oder wenn Sie eine Anwendung entwickeln, die solche Konventionen historisch nicht verwendet hat. Es ist auch möglich, beide Loader zusammen zu verwenden.

Version: 4.0