RobotLoader : Autoloading de classe
RobotLoader est un outil qui vous permet de charger automatiquement des classes pour l'ensemble de votre application, y compris les bibliothèques tierces.
- Éliminez toutes les déclarations
require
- Seuls les scripts nécessaires seront chargés
- Ne nécessite pas de conventions de nommage strictes pour les répertoires ou les fichiers
- Extrêmement rapide
- Pas de mise à jour manuelle du cache, tout s'exécute automatiquement
- Bibliothèque mature, stable et largement utilisée
Nous pouvons donc oublier ces blocs de code familiers :
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
//...
Installation
Vous pouvez télécharger RobotLoader sous la forme d'un seul fichier autonome
RobotLoader.php
, que vous incluez à l'aide de require
dans votre script, et profiter
instantanément d'un chargement automatique confortable pour l'ensemble de l'application.
require '/path/to/RobotLoader.php';
$loader = new Nette\Loaders\RobotLoader;
//...
Si vous construisez une application à l'aide de Composer, vous pouvez l'installer via :
composer require nette/robot-loader
Utilisation
De la même manière que le robot Google parcourt et indexe les pages web, RobotLoader parcourt tous les scripts PHP et note les classes, interfaces, traits et enums qu'il a trouvés. Il stocke ensuite les résultats dans le cache pour les utiliser lors de requêtes ultérieures. Il vous suffit de spécifier les répertoires qu'il doit parcourir et l'endroit où il doit stocker 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');
// Définir la mise en cache dans le répertoire "temp".
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Activer RobotLoader
Et c'est tout, à partir de maintenant, nous n'avons plus besoin d'utiliser require
. Génial !
Si RobotLoader rencontre un nom de classe dupliqué pendant l'indexation, il lèvera une exception et vous en informera. RobotLoader met également à jour automatiquement le cache lorsqu'il doit charger une classe inconnue. Nous recommandons de désactiver cette fonction sur les serveurs de production, voir Caching.
Si vous souhaitez que RobotLoader ignore certains répertoires, utilisez $loader->excludeDirectory('temp')
(peut être appelé plusieurs fois ou passer plusieurs répertoires).
Par défaut, RobotLoader signale les erreurs dans les fichiers PHP en lançant une exception ParseError
. Cette
exception peut être supprimée en utilisant $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 également être utilisé uniquement pour trouver des classes, des interfaces, des traits et des enums dans les fichiers PHP sans utiliser la fonction d'autoloading :
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Recherche les classes/interfaces/traits/enums 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 la mise en cache. Cela permet de s'assurer que les fichiers inchangés ne seront pas analysés à nouveau :
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Définit la mise en cache dans le répertoire "temp".
$loader->setTempDirectory(__DIR__ . '/temp');
// Analyse les répertoires en utilisant le cache
$loader->refresh();
// Retourne un tableau de paires classe => nom de fichier
$res = $loader->getIndexedClasses();
Mise en cache
RobotLoader est très rapide parce qu'il utilise intelligemment la mise en cache.
Pendant le développement, vous remarquez à peine qu'il fonctionne en arrière-plan. Il met continuellement à jour son cache, en tenant compte du fait que les classes et les fichiers peuvent être créés, supprimés, renommés, etc. Et il ne rescanne pas les fichiers inchangés.
Sur un serveur de production, en revanche, nous recommandons de désactiver les mises à jour du cache à l'aide de
$loader->setAutoRefresh(false)
(dans une application Nette, cela se fait automatiquement), car les fichiers ne
changent pas. En même temps, il est nécessaire de vider le cache lors de l'envoi d'une nouvelle version à
l'hébergement.
L'analyse initiale des fichiers, lorsque le cache n'existe pas encore, peut naturellement prendre un certain temps pour les grandes applications. RobotLoader dispose d'une prévention intégrée contre la ruée vers le cache. Il s'agit d'une situation dans laquelle un grand nombre de demandes simultanées sur un serveur de production déclencherait RobotLoader, et comme le cache n'existe pas encore, elles commenceraient toutes à analyser les fichiers, ce qui surchargerait le serveur. Heureusement, RobotLoader fonctionne de telle manière que seul le premier thread indexe les fichiers, crée le cache, et que les autres attendent et utilisent ensuite le cache.
PSR-4
Aujourd'hui, vous pouvez utiliser Composer pour l'autoloading tout en
adhérant à PSR-4. En termes simples, il s'agit d'un système dans lequel les espaces de noms et les noms de classes
correspondent à la structure des répertoires et aux noms de fichiers, par exemple, App\Core\RouterFactory
sera dans
le fichier /path/to/App/Core/RouterFactory.php
.
RobotLoader n'est pas lié à une structure fixe, il est donc utile dans les situations où vous ne voulez pas que la structure du répertoire soit conçue exactement comme les espaces de noms PHP, ou lorsque vous développez une application qui n'utilise pas historiquement de telles conventions. Il est également possible d'utiliser les deux chargeurs ensemble.