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.

versión: 4.0