Nette Documentation Preview

syntax
RobotLoader: Carga automática de clases
***************************************

<div class=perex>

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.

- Elimina todas las sentencias `require`
- Sólo se cargarán los scripts necesarios
- No requiere convenciones de nomenclatura estrictas para directorios o archivos
- Extremadamente rápido
- Sin actualizaciones manuales de la caché, todo se ejecuta automáticamente
- Biblioteca madura, estable y ampliamente utilizada

</div>

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

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


Instalación .[#toc-installation]
--------------------------------

Puede descargar RobotLoader como un [único archivo independiente `RobotLoader.php` |https://github.com/nette/robot-loader/raw/standalone/src/RobotLoader/RobotLoader.php], que incluirá utilizando `require` en su script, y disfrutar al instante de una cómoda carga automática para toda la aplicación.

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

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

Si estás construyendo una aplicación usando [Composer |best-practices:composer], puedes instalarlo a través de:

```shell
composer require nette/robot-loader
```


Utilización .[#toc-usage]
-------------------------

De forma similar a como el robot de Google rastrea e indexa páginas web, el [RobotLoader |api:Nette\Loaders\RobotLoader] recorre todos los scripts PHP y anota las clases, interfaces, traits y enums que encuentra. A continuación, almacena los resultados en la caché para su uso en solicitudes posteriores. Sólo tienes que especificar qué directorios debe recorrer y dónde almacenar la caché:

```php
$loader = new Nette\Loaders\RobotLoader;

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

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

Y ya está, a partir de este momento no necesitamos usar `require`. ¡Impresionante!

Si RobotLoader encuentra un nombre de clase duplicado durante la indexación, lanzará una excepción y te lo notificará. RobotLoader también actualiza automáticamente la caché cuando necesita cargar una clase desconocida. Recomendamos desactivar esta opción en servidores de producción, ver [Caché |#Caching].

Si desea que RobotLoader omita ciertos directorios, utilice `$loader->excludeDirectory('temp')` (puede llamarse varias veces o pasar varios directorios).

Por defecto, RobotLoader informa de errores en archivos PHP lanzando una excepción `ParseError`. Esto puede suprimirse usando `$loader->reportParseErrors(false)`.


Aplicación Nette .[#toc-nette-application]
------------------------------------------

Dentro de la Aplicación Nette, donde `$configurator` se utiliza en `Bootstrap.php`, puede configurar RobotLoader de esta manera:

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


Analizador de archivos PHP .[#toc-php-files-analyzer]
-----------------------------------------------------

RobotLoader también puede ser usado puramente para encontrar clases, interfaces, traits y enums en archivos PHP **sin** usar la función de autocarga:

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

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

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

Incluso con este uso, puede utilizar el almacenamiento en caché. Esto asegura que los archivos no modificados no serán escaneados de nuevo:

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

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

// Escanea los directorios usando la caché
$loader->refresh();

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


Almacenamiento en caché .[#toc-caching]
---------------------------------------

RobotLoader es muy rápido porque utiliza inteligentemente el almacenamiento en caché.

Durante el desarrollo, apenas se nota que está funcionando en segundo plano. Actualiza continuamente su caché, teniendo en cuenta que las clases y archivos pueden ser creados, borrados, renombrados, etc. Y no vuelve a escanear los archivos no modificados.

En un servidor de producción, en cambio, recomendamos desactivar las actualizaciones de la caché mediante `$loader->setAutoRefresh(false)` (en una aplicación Nette, esto sucede automáticamente), porque los archivos no cambian. Al mismo tiempo, es necesario **limpiar la caché** cuando se sube una nueva versión al hosting.

El escaneo inicial de archivos, cuando la caché aún no existe, puede tardar un momento en las aplicaciones más grandes. RobotLoader tiene incorporada una prevención contra la "estampida de:https://en.wikipedia.org/wiki/Cache_stampede caché".
Esta es una situación en la que un gran número de peticiones concurrentes en un servidor de producción activaría RobotLoader, y puesto que la caché no existe todavía, todos empezarían a escanear archivos, lo que sobrecargaría el servidor.
Afortunadamente, RobotLoader funciona de tal manera que sólo el primer hilo indexa los archivos, crea la caché, y el resto espera y luego utiliza la caché.


PSR-4 .[#toc-psr-4]
-------------------

Hoy en día, se puede utilizar [Composer para la autocarga |best-practices:composer#autoloading] respetando 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; por ejemplo, `App\Core\RouterFactory` estará en el archivo `/path/to/App/Core/RouterFactory.php`.

RobotLoader no está atado a ninguna estructura fija, por lo que es útil en situaciones en las que no se desea tener la estructura de directorios diseñada exactamente como los espacios de nombres de PHP, o cuando se desarrolla una aplicación que históricamente no utiliza tales convenciones. También es posible usar ambos cargadores juntos.


{{leftbar: nette:@menu-topics}}

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.

  • Elimina todas las sentencias require
  • Sólo se cargarán los scripts necesarios
  • No requiere convenciones de nomenclatura estrictas para directorios o archivos
  • Extremadamente rápido
  • Sin actualizaciones manuales de la caché, todo se ejecuta automáticamente
  • Biblioteca madura, estable y ampliamente utilizada

Así, podemos olvidarnos de estos bloques de código tan 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 incluirá utilizando require en su script, y disfrutar al instante de una cómoda carga automática para toda la aplicación.

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

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

Si estás construyendo una aplicación usando Composer, puedes instalarlo a través de:

composer require nette/robot-loader

Utilización

De forma similar a como el robot de Google rastrea e indexa páginas web, el RobotLoader recorre todos los scripts PHP y anota las clases, interfaces, traits y enums que encuentra. A continuación, almacena los resultados en la caché para su uso en solicitudes posteriores. Sólo tienes que especificar qué directorios debe recorrer y dónde almacenar la caché:

$loader = new Nette\Loaders\RobotLoader;

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

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

Y ya está, a partir de este momento no necesitamos usar require. ¡Impresionante!

Si RobotLoader encuentra un nombre de clase duplicado durante la indexación, lanzará una excepción y te lo notificará. RobotLoader también actualiza automáticamente la caché cuando necesita cargar una clase desconocida. Recomendamos desactivar esta opción en servidores de producción, ver Caché.

Si desea que RobotLoader omita ciertos directorios, utilice $loader->excludeDirectory('temp') (puede llamarse varias veces o pasar varios directorios).

Por defecto, RobotLoader informa de errores en archivos PHP lanzando una excepción ParseError. Esto puede suprimirse usando $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, traits y enums en archivos PHP sin usar la función de autocarga:

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

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

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

Incluso con este uso, puede utilizar el almacenamiento en caché. Esto asegura que los archivos no modificados no serán escaneados de nuevo:

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

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

// Escanea los directorios usando la 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 el almacenamiento en caché.

Durante el desarrollo, apenas se nota que está funcionando en segundo plano. Actualiza continuamente su caché, teniendo en cuenta que las clases y archivos pueden ser creados, borrados, renombrados, etc. Y no vuelve a escanear los archivos no modificados.

En un servidor de producción, en cambio, recomendamos desactivar las actualizaciones de la caché mediante $loader->setAutoRefresh(false) (en una aplicación Nette, esto sucede automáticamente), porque los archivos no cambian. Al mismo tiempo, es necesario limpiar la caché cuando se sube una nueva versión al hosting.

El escaneo inicial de archivos, cuando la caché aún no existe, puede tardar un momento en las aplicaciones más grandes. RobotLoader tiene incorporada una prevención contra la „estampida de:https://en.wikipedia.org/…che_stampede caché“. Esta es una situación en la que un gran número de peticiones concurrentes en un servidor de producción activaría RobotLoader, y puesto que la caché no existe todavía, todos empezarían a escanear archivos, lo que sobrecargaría el servidor. Afortunadamente, RobotLoader funciona de tal manera que sólo el primer hilo indexa los archivos, crea la caché, y el resto espera y luego utiliza la caché.

PSR-4

Hoy en día, se puede utilizar Composer para la autocarga respetando 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; por ejemplo, App\Core\RouterFactory estará en el archivo /path/to/App/Core/RouterFactory.php.

RobotLoader no está atado a ninguna estructura fija, por lo que es útil en situaciones en las que no se desea tener la estructura de directorios diseñada exactamente como los espacios de nombres de PHP, o cuando se desarrolla una aplicación que históricamente no utiliza tales convenciones. También es posible usar ambos cargadores juntos.