RobotLoader : Auto-chargement des classes
RobotLoader est un outil qui vous offre le confort du chargement automatique des classes pour l'ensemble de votre application, y compris les bibliothèques tierces.
- se débarrasser de tout
require
- seuls les scripts nécessaires sont chargés
- ne nécessite pas de conventions strictes en matière de nom de répertoire ou de fichier
On peut donc oublier ces fameux blocs de code :
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
// ...
Installation
Téléchargez et installez le paquet en utilisant Composer:
composer require nette/robot-loader
Utilisation
Tout comme le robot Google explore et indexe les sites Web, RobotLoader explore tous les scripts PHP et enregistre les classes et les interfaces qu'ils contiennent. Ces enregistrements sont ensuite sauvegardés dans le cache et utilisés lors de toutes les requêtes ultérieures. Il vous suffit de spécifier les répertoires à indexer et l'endroit où sauvegarder le cache :
$loader = new Nette\Loaders\RobotLoader;
// répertoires à indexer par RobotLoader (y compris les sous-répertoires)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');
// utiliser le répertoire 'temp' pour le cache
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Exécution du RobotLoader
Et c'est tout. A partir de maintenant, vous n'avez plus besoin d'utiliser require
. Super, n'est-ce pas ?
Lorsque RobotLoader rencontre un nom de classe en double pendant l'indexation, il lève une exception et vous en informe. RobotLoader met aussi automatiquement à jour le cache lorsqu'il doit charger une classe qu'il ne connaît pas. Nous recommandons de désactiver cette fonction sur les serveurs de production, voir Mise en cache.
Si vous voulez que RobotLoader saute certains répertoires, utilisez $loader->excludeDirectory('temp')
(il peut
être appelé plusieurs fois ou vous pouvez passer plusieurs répertoires).
Par défaut, RobotLoader signale les erreurs dans les fichiers PHP en lançant l'exception ParseError
. Elle peut
être désactivée via $loader->reportParseErrors(false)
.
Application Nette
Dans l'application Nette, où $configurator
est utilisé dans Bootstrap.php
, vous pouvez configurer
RobotLoader de cette façon :
$configurator = new Nette\Bootstrap\Configurator;
// ...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
Analyseur de fichiers PHP
RobotLoader peut aussi être utilisé uniquement pour trouver des classes, des interfaces et des traits dans les fichiers PHP **sans utiliser la fonction de chargement automatique :
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Recherche des classes, interfaces et traits dans les répertoires.
$loader->rebuild();
// Retourne un tableau de paires classe => nom de fichier
$res = $loader->getIndexedClasses();
Même avec une telle utilisation, vous pouvez utiliser le cache. Ainsi, les fichiers non modifiés ne seront pas analysés à plusieurs reprises lors d'une nouvelle recherche :
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
$loader->setTempDirectory(__DIR__ . '/temp');
// Analyse des répertoires en utilisant un cache
$loader->refresh();
// Retourne un tableau de paires classe => nom de fichier
$res = $loader->getIndexedClasses();
Mise en cache
RobotLoader est très rapide car il utilise intelligemment le cache.
Lorsque vous développez avec lui, vous n'avez pratiquement aucune idée qu'il fonctionne en arrière-plan. Il met continuellement à jour le cache car il sait que les classes et les fichiers peuvent être créés, supprimés, renommés, etc. Et il n'analyse pas de manière répétée les fichiers non modifiés.
En revanche, lorsqu'il est utilisé sur un serveur de production, nous recommandons de désactiver la mise à jour du cache à
l'aide de $loader->setAutoRefresh(false)
(cela se fait automatiquement dans l'application Nette), car les fichiers
ne changent pas. En même temps, il est nécessaire de nettoyer le cache lors du téléchargement d'une nouvelle version
sur l'hébergement.
Bien sûr, le balayage initial des fichiers, lorsque le cache n'existe pas encore, peut prendre quelques secondes pour les applications plus importantes. RobotLoader a une prévention intégrée contre la ruée vers le cache. Il s'agit d'une situation dans laquelle le serveur de production reçoit un grand nombre de demandes simultanées et, comme le cache de RobotLoader n'existe pas encore, elles commencent toutes à analyser les fichiers. Ce qui fait monter en flèche l'utilisation du CPU et du système de fichiers. Heureusement, RobotLoader fonctionne de telle manière que pour plusieurs demandes simultanées, seul le premier thread indexe les fichiers, crée un cache, les autres attendent, puis utilisent le cache.
PSR-4
Aujourd'hui, Composer peut être utilisé pour l'autoloading en conformité avec PSR-4. En d'autres
termes, il s'agit d'un système où les espaces de noms et les noms de classes correspondent à la structure des répertoires et
aux noms de fichiers, c'est-à-dire que App\Router\RouterFactory
est situé dans le fichier
/path/to/App/Router/RouterFactory.php
.
RobotLoader n'est lié à aucune structure fixe, il est donc utile dans les situations où il ne vous convient pas d'avoir une structure de répertoire conçue comme des espaces de noms en PHP, ou lorsque vous développez une application qui n'a historiquement pas utilisé de telles conventions. Il est également possible d'utiliser les deux chargeurs ensemble.