Nette RobotLoader

RobotLoader es una herramienta que le proporciona la comodidad de la carga automática de clases en toda su aplicación, incluidas las bibliotecas de terceros.

  • Elimina todas las sentencias require
  • Solo se cargan los scripts necesarios
  • No exige convenciones estrictas de nombres de directorios ni de archivos
  • Extremadamente rápido
  • Nada de actualizar la caché a mano; todo ocurre automáticamente
  • Biblioteca madura, estable y muy usada

Así podemos olvidarnos de estos bloques de código tan conocidos:

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, incluirlo con require en su script y disfrutar al instante de un autoloading cómodo en toda la aplicación.

require '/path/to/RobotLoader.php';

$loader = new Nette\Loaders\RobotLoader;
// ...

Si construye una aplicación con Composer, puede instalarlo con:

composer require nette/robot-loader

Uso

De forma parecida a como el robot de Google recorre e indexa las páginas web, RobotLoader recorre todos los scripts PHP y anota qué clases, interfaces, traits y enums ha encontrado. Después guarda esos hallazgos en una caché y los usa en las peticiones siguientes. Solo tiene que indicarle qué directorios debe recorrer y dónde guardar la caché:

$loader = new Nette\Loaders\RobotLoader;

// Directorios que RobotLoader debe indexar (incluidos los subdirectorios)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// Establece la caché en el directorio 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Activa RobotLoader

¡Y eso es todo! A partir de ahora no necesita usar require. ¡Genial!

Si durante la indexación RobotLoader se topa con un nombre de clase duplicado, lanzará una excepción y se lo avisará. RobotLoader también actualiza automáticamente la caché cuando necesita cargar una clase que no conoce. En los servidores de producción recomendamos desactivarlo; vea Caché.

Si quiere que RobotLoader se salte ciertos directorios, use $loader->excludeDirectory('temp') (se puede llamar varias veces o pasarle varios directorios).

De forma predeterminada, RobotLoader solo recorre los archivos con la extensión .php. Para indexar también otros tipos de archivo, ajuste la propiedad $acceptFiles, que contiene un array de máscaras:

$loader->acceptFiles = ['*.php', '*.inc'];

La propiedad $ignoreDirs contiene, del mismo modo, las máscaras de los directorios que siempre se saltan al recorrer (de forma predeterminada .*, *.old, *.bak, *.tmp, temp).

De forma predeterminada, RobotLoader informa de los errores de los archivos PHP lanzando una excepción ParseError. Eso se puede suprimir con $loader->reportParseErrors(false).

Por debajo, register() engancha el método tryLoad() a la cadena de autoloading de PHP. Siempre que PHP necesita una clase, interfaz, trait o enum desconocidos, le pasa el nombre a $loader->tryLoad($type), que encuentra el archivo correspondiente y lo incluye.

Nette Application

Dentro de una Nette Application, donde en el archivo de arranque Bootstrap.php se usa el objeto $configurator, la configuració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 únicamente para encontrar clases, interfaces, traits y enums en archivos PHP sin usar la función de autoloading:

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

// Recorre los directorios en busca de clases/interfaces/traits/enums
$loader->rebuild();

// Devuelve un array de pares clase => nombre de archivo
$res = $loader->getIndexedClasses();

Incluso con este uso puede aprovechar la caché. Eso asegura que los archivos que no han cambiado no se vuelvan a recorrer:

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

// Establece la caché en el directorio 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');

// Recorre 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 usa la caché con inteligencia.

Durante el desarrollo apenas se nota que funciona en segundo plano. Actualiza continuamente su caché, previendo que se puedan crear, borrar o renombrar clases y archivos. Y no vuelve a recorrer los archivos que no han cambiado.

En un servidor de producción, al contrario, recomendamos desactivar la actualización de la caché con $loader->setAutoRefresh(false) (en una Nette Application esto ocurre automáticamente), porque los archivos no cambian. Al mismo tiempo hay que vaciar la caché al subir una versión nueva al hosting.

El recorrido inicial de los archivos, cuando la caché todavía no existe, puede llevar un momento en las aplicaciones más grandes, como es natural. RobotLoader tiene integrada una prevención contra la estampida de caché. Es la situación en la que un gran número de peticiones concurrentes en un servidor de producción disparan RobotLoader y, como la caché todavía no existe, todas empezarían a recorrer los archivos y podrían sobrecargar el servidor. Por suerte, RobotLoader funciona de modo que, con varias peticiones concurrentes, solo el primer hilo indexa los archivos y crea la caché, mientras los demás esperan y usan después la caché generada.

PSR-4

Hoy en día puede usar Composer para el autoloading respetando PSR-4. Dicho de forma sencilla, es 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, p. ej. App\Core\RouterFactory estará en el archivo /path/to/App/Core/RouterFactory.php.

RobotLoader no está atado a ninguna estructura fija, así que resulta útil en las situaciones en las que no quiere que la estructura de directorios se corresponda exactamente con los espacios de nombres de PHP, o cuando desarrolla una aplicación que históricamente no usa esas convenciones. También es posible usar los dos loaders a la vez.

Si está actualizando a una versión más reciente, vea la página de actualización.

versión: 4.x