RobotLoader: Carga automática de clases
RobotLoader es una herramienta que le ofrece la comodidad de la carga automática de clases para toda su aplicación, incluidas las bibliotecas de terceros.
- deshacerse de todos
require
- sólo se cargan los scripts necesarios
- no requiere estrictas convenciones de nomenclatura de directorios o archivos
Así que podemos olvidarnos de los famosos bloques de código:
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
// ...
Instalación
Descargue e instale el paquete utilizando Composer:
composer require nette/robot-loader
Utilización
Al igual que el robot de Google rastrea e indexa sitios web, RobotLoader rastrea todos los scripts PHP y registra qué clases e interfaces se encontraron en ellos. Estos registros se guardan en la caché y se utilizan durante todas las solicitudes posteriores. Sólo necesita especificar qué directorios indexar y dónde guardar la caché:
$loader = new Nette\Loaders\RobotLoader;
// directorios a indexar por RobotLoader (incluyendo subdirectorios)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');
// usar directorio 'temp' para caché
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Ejecutar el RobotLoader
Y eso es todo. A partir de ahora, no necesitará utilizar require
. Estupendo, ¿verdad?
Cuando RobotLoader encuentra un nombre de clase duplicado durante la indexación, lanza una excepción y te informa de ello. RobotLoader también actualiza automáticamente la caché cuando tiene que cargar una clase que no conoce. Recomendamos desactivar esto en los servidores de producción, ver Caché.
Si quieres que RobotLoader se salte algunos directorios, utiliza $loader->excludeDirectory('temp')
(se puede
llamar varias veces o puedes pasar varios directorios).
Por defecto, RobotLoader informa de errores en archivos PHP lanzando la excepción ParseError
. Se puede desactivar
a través de $loader->reportParseErrors(false)
.
Aplicación Nette
Dentro de la aplicación Nette, donde $configurator
se utiliza en Bootstrap.php
, puede configurar
RobotLoader de esta manera:
$configurator = new Nette\Bootstrap\Configurator;
// ...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
Analizador de archivos PHP
RobotLoader también puede ser usado puramente para encontrar clases, interfaces y traits en archivos PHP sin usar la característica de autocarga:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Busca clases / interfaces / traits en los directorios
$loader->rebuild();
// Devuelve un array de pares clase => nombre de fichero
$res = $loader->getIndexedClasses();
Incluso con tal uso, puede utilizar la caché. Como resultado, los archivos no modificados no serán analizados repetidamente al volver a escanear:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
$loader->setTempDirectory(__DIR__ . '/temp');
// Escanea directorios usando una caché
$loader->refresh();
// Devuelve un array de pares clase => nombre de fichero
$res = $loader->getIndexedClasses();
Almacenamiento en caché
RobotLoader es muy rápido porque utiliza inteligentemente la caché.
Cuando desarrollas con él, prácticamente no tienes ni idea de que se ejecuta en segundo plano. Actualiza continuamente la caché porque sabe que las clases y archivos pueden ser creados, borrados, renombrados, etc. Y no escanea repetidamente archivos no modificados.
En cambio, cuando se utiliza en un servidor de producción, se recomienda desactivar la actualización de la caché mediante
$loader->setAutoRefresh(false)
(esto se hace automáticamente en la aplicación Nette), porque los ficheros no
cambian. Al mismo tiempo, es necesario limpiar la caché al subir una nueva versión al hosting.
Por supuesto, el escaneo inicial de los archivos, cuando la caché no existe ya, puede tardar unos segundos para las aplicaciones más grandes. RobotLoader tiene incorporada una prevención contra la “estampida de:https://en.wikipedia.org/…che_stampede caché”. Se trata de una situación en la que el servidor de producción recibe un gran número de peticiones simultáneas y, debido a que la caché de RobotLoader aún no existe, todas ellas comenzarían a escanear los archivos. Lo que dispara el uso de la CPU y del sistema de archivos. Afortunadamente, RobotLoader funciona de tal manera que para múltiples peticiones concurrentes, sólo el primer hilo indexa los archivos, crea una caché, los demás esperan, y luego utilizan la caché.
PSR-4
En la actualidad, Composer puede utilizarse para la autolectura de conformidad con PSR-4. En pocas
palabras, se trata de un sistema en el que los espacios de nombres y los nombres de las clases se corresponden con la estructura
de directorios y los nombres de los archivos, es decir, App\Router\RouterFactory
se encuentra en el archivo
/path/to/App/Router/RouterFactory.php
.
RobotLoader no está atado a ninguna estructura fija, por lo tanto, es útil en situaciones donde no le conviene tener la estructura de directorios diseñada como namespaces en PHP, o cuando está desarrollando una aplicación que históricamente no ha usado tales convenciones. También es posible usar ambos cargadores juntos.