RobotLoader: autoloading de clases
RobotLoader es una herramienta que le brinda la comodidad de cargar automáticamente clases para toda su aplicación, incluidas las bibliotecas de terceros.
- nos deshacemos de todos los
require
- solo se cargarán los scripts necesarios
- no requiere convenciones estrictas de nomenclatura de directorios o archivos
- extremadamente rápido
- sin actualizaciones manuales de caché, todo sucede automáticamente
- biblioteca madura, estable y ampliamente utilizada
Podemos olvidarnos de estos bloques de código familiares:
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
// ...
Instalación
Puede descargar RobotLoader como un único archivo independiente
RobotLoader.php
, que incluye usando require
en su script e inmediatamente tiene disponible un
cómodo autoloading para toda la aplicación.
require '/path/to/RobotLoader.php';
$loader = new Nette\Loaders\RobotLoader;
// ...
Si está construyendo una aplicación que utiliza Composer, puede instalarlo a través de él:
composer require nette/robot-loader
Uso
De manera similar a como el robot de Google rastrea e indexa páginas web, RobotLoader recorre todos los scripts PHP y registra qué clases, interfaces, traits y enums encontró en ellos. Luego guarda los resultados de la investigación en la caché y los usa en la siguiente solicitud. Simplemente especifique qué directorios debe recorrer y dónde guardar la caché:
$loader = new Nette\Loaders\RobotLoader;
// directorios que RobotLoader debe indexar (incluidos subdirectorios)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');
// establecemos el almacenamiento en caché en el directorio 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // iniciamos RobotLoader
Y eso es todo, a partir de ahora no necesitamos usar require
. ¡Genial!
Si RobotLoader encuentra un nombre de clase duplicado durante la indexación, lanzará una excepción y le informará al respecto. RobotLoader también actualiza automáticamente la caché cuando tiene que cargar una clase que no conoce. Recomendamos desactivar esto en servidores de producción, consulte Cache.
Si desea que RobotLoader omita algunos directorios, use $loader->excludeDirectory('temp')
(se puede llamar
varias veces o pasar varios directorios).
De forma predeterminada, RobotLoader informa errores en archivos PHP lanzando una excepción ParseError
. Esto se
puede suprimir usando $loader->reportParseErrors(false)
.
Aplicación Nette
Dentro de una aplicación Nette, donde se utiliza el objeto $configurator
en el archivo de arranque
Bootstrap.php
, la notación se puede simplificar:
$configurator = new Nette\Bootstrap\Configurator;
// ...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
Analizador de archivos PHP
RobotLoader también se puede usar puramente para buscar clases, interfaces, traits y enums en archivos PHP sin utilizar la función de autoloading:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// busca clases / interfaces / traits / enums en los directorios
$loader->rebuild();
// devuelve un array de pares clase => nombre de archivo
$res = $loader->getIndexedClasses();
Incluso con este uso, puede utilizar la caché. Gracias a esto, al volver a escanear, los archivos sin cambios no se analizarán repetidamente:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// establecemos el almacenamiento en caché en el directorio 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');
// busca en los directorios usando la caché
$loader->refresh();
// devuelve un array de pares clase => nombre de archivo
$res = $loader->getIndexedClasses();
Caché
RobotLoader es muy rápido porque utiliza inteligentemente la caché.
Durante el desarrollo, prácticamente no se da cuenta de que se está ejecutando en segundo plano. Actualiza continuamente la caché, porque asume que las clases y los archivos pueden crearse, desaparecer, renombrarse, etc. Y no vuelve a escanear archivos que no han cambiado.
Al implementar en un servidor de producción, por el contrario, recomendamos desactivar la actualización de la caché usando
$loader->setAutoRefresh(false)
(en una aplicación Nette esto sucede automáticamente), porque los archivos no
cambian. Al mismo tiempo, es necesario eliminar la caché al cargar una nueva versión en el hosting.
El escaneo inicial de archivos, cuando la caché aún no existe, puede llevar un momento para aplicaciones más grandes. RobotLoader tiene una prevención incorporada contra la estampida de caché. Esta es una situación en la que un mayor número de solicitudes simultáneas llegan al servidor de producción, inician RobotLoader y, como la caché aún no existe, todas comenzarían a escanear archivos. Lo que sobrecargaría indebidamente el servidor. Afortunadamente, RobotLoader funciona de tal manera que con múltiples solicitudes simultáneas, solo el primer hilo indexa los archivos, crea la caché, los demás esperan y luego usan la caché.
PSR-4
Hoy en día, se puede usar Composer para
autoloading siguiendo PSR-4. En pocas palabras, es un sistema donde los espacios de nombres y los nombres de las clases
corresponden a la estructura de directorios y los nombres de los archivos, es decir, App\Core\RouterFactory
estará
en el archivo /path/to/App/Core/RouterFactory.php
.
RobotLoader no está vinculado a ninguna estructura fija, por lo que es útil en situaciones en las que no le conviene tener una estructura de directorios diseñada de la misma manera que los espacios de nombres en PHP, o cuando desarrolla una aplicación que históricamente no utiliza tales convenciones. También es posible usar ambos loaders juntos.