RobotLoader: Caricamento automatico delle classi

RobotLoader è uno strumento che consente il caricamento automatico delle classi per l'intera applicazione, comprese le librerie di terze parti.

  • sbarazzarsi di tutti require
  • vengono caricati solo gli script necessari
  • non richiede rigide convenzioni di denominazione delle directory o dei file

Quindi possiamo dimenticare i famosi blocchi di codice:

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

Installazione

Scaricare e installare il pacchetto utilizzando Composer:

composer require nette/robot-loader

Uso

Come il robot di Google effettua la scansione e l'indicizzazione dei siti web, RobotLoader effettua la scansione di tutti gli script PHP e registra quali classi e interfacce sono state trovate in essi. Questi record vengono poi salvati nella cache e utilizzati durante tutte le richieste successive. È sufficiente specificare quali directory indicizzare e dove salvare la cache:

$loader = new Nette\Loaders\RobotLoader;

// le directory da indicizzare da RobotLoader (incluse le sottodirectory)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// utilizzare la cartella 'temp' per la cache
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Eseguire il RobotLoader

E questo è tutto. D'ora in poi, non sarà più necessario usare require. Fantastico, non è vero?

Quando RobotLoader incontra un nome di classe duplicato durante l'indicizzazione, lancia un'eccezione e informa l'utente. RobotLoader aggiorna automaticamente la cache quando deve caricare una classe che non conosce. Si consiglia di disabilitare questa funzione sui server di produzione, vedere Cache.

Se si desidera che RobotLoader salti alcune directory, utilizzare $loader->excludeDirectory('temp') (può essere chiamato più volte o si possono passare più directory).

Per impostazione predefinita, RobotLoader segnala gli errori nei file PHP lanciando l'eccezione ParseError. Può essere disabilitato tramite $loader->reportParseErrors(false).

Applicazione Nette

All'interno dell'applicazione Nette, dove $configurator è utilizzato in Bootstrap.php, è possibile impostare RobotLoader in questo modo:

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

Analizzatore di file PHP

RobotLoader può essere usato anche solo per trovare classi, interfacce e tratti nei file PHP senza usare la funzione di caricamento automatico:

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

// Esegue la scansione delle directory per classi, interfacce e tratti.
$loader->rebuild();

// Restituisce un array di coppie classe => nome file
$res = $loader->getIndexedClasses();

Anche in questo caso, è possibile utilizzare la cache. Di conseguenza, i file non modificati non verranno analizzati ripetutamente durante la ricognizione:

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

// Esegue la scansione delle directory utilizzando una cache
$loader->refresh();

// Restituisce un array di coppie classe => nome file
$res = $loader->getIndexedClasses();

Caching

RobotLoader è molto veloce perché utilizza in modo intelligente la cache.

Quando si sviluppa con esso, non si ha praticamente idea che venga eseguito in background. Aggiorna continuamente la cache perché sa che le classi e i file possono essere creati, cancellati, rinominati, ecc. E non esegue ripetutamente la scansione di file non modificati.

Se si utilizza su un server di produzione, invece, si consiglia di disabilitare l'aggiornamento della cache tramite $loader->setAutoRefresh(false) (ciò avviene automaticamente nell'applicazione Nette), perché i file non vengono modificati. Allo stesso tempo, è necessario pulire la cache quando si carica una nuova versione sull'hosting.

Naturalmente, la scansione iniziale dei file, quando la cache non esiste già, può richiedere alcuni secondi per le applicazioni più grandi. RobotLoader ha una prevenzione integrata contro la fuga dalla cache. Si tratta di una situazione in cui il server di produzione riceve un gran numero di richieste simultanee e, poiché la cache di RobotLoader non esiste ancora, tutte iniziano a scansionare i file. Il che fa impennare l'utilizzo della CPU e del filesystem. Fortunatamente, RobotLoader funziona in modo tale che, in caso di più richieste contemporanee, solo il primo thread indicizza i file, crea una cache, gli altri aspettano e poi utilizzano la cache.

PSR-4

Oggi Composer può essere utilizzato per l'autocaricamento in conformità al PSR-4. In parole povere, si tratta di un sistema in cui gli spazi dei nomi e i nomi delle classi corrispondono alla struttura delle directory e ai nomi dei file, ad esempio App\Router\RouterFactory si trova nel file /path/to/App/Router/RouterFactory.php.

RobotLoader non è legato a nessuna struttura fissa, quindi è utile in situazioni in cui non è opportuno avere la struttura delle directory progettata come spazi dei nomi in PHP, oppure quando si sta sviluppando un'applicazione che storicamente non ha usato tali convenzioni. È anche possibile utilizzare entrambi i caricatori insieme.

versione: 4.0