RobotLoader: Carregamento automático de classe

RobotLoader é uma ferramenta que lhe dá conforto de carregamento automatizado de classe para toda a sua aplicação, incluindo bibliotecas de terceiros.

  • se livrar de todos require
  • somente os scripts necessários são carregados
  • não requer convenções rigorosas de diretório ou de nomes de arquivos

Assim, podemos esquecer esses famosos blocos de código:

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

Instalação

Você pode fazer o download do RobotLoader como um único arquivo autônomo RobotLoader.php, que pode ser incluído no seu script usando require, e ter imediatamente um carregamento automático conveniente para todo o seu aplicativo:

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

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

Se estiver criando um aplicativo que usa o Composer, poderá instalá-lo por meio dele:

composer require nette/robot-loader

Utilização

Como o robô Google rastreia e indexa websites, o RobotLoader rastreia todos os scripts PHP e registra quais classes e interfaces foram encontradas neles. Estes registros são então salvos em cache e utilizados durante todas as solicitações subseqüentes. Basta especificar quais diretórios indexar e onde salvar o cache:

$loader = new Nette\Loaders\RobotLoader;

// diretórios a serem indexados pelo RobotLoader (incluindo subdiretórios)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// usar diretório 'temp' para cache
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Executar o RobotLoader

E isso é tudo. De agora em diante, você não precisa usar require. Ótimo, não é?

Quando o RobotLoader encontra um nome de classe duplicado durante a indexação, ele lança uma exceção e o informa sobre isso. O RobotLoader também atualiza automaticamente o cache quando ele tem que carregar uma classe que não conhece. Recomendamos desativar isto nos servidores de produção, veja Caching.

Se você quiser que RobotLoader salte alguns diretórios, use $loader->excludeDirectory('temp') (pode ser chamado várias vezes ou você pode passar por vários diretórios).

Por padrão, o RobotLoader reporta erros em arquivos PHP lançando a exceção ParseError. Ele pode ser desativado via $loader->reportParseErrors(false).

Aplicação Nette

Dentro da aplicação Nette, onde $configurator é usado em Bootstrap.php, você pode configurar o RobotLoader desta forma:

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

Analisador de arquivos PHP

RobotLoader também pode ser usado puramente para encontrar classes, interfaces e traços em arquivos PHP **sem*** usando o recurso de auto-carregamento:

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

// Escaneia diretórios de classes / interfaces / traços
$loader->rebuild();

// Retorna matriz de classe => pares de nomes de arquivo
$res = $loader->getIndexedClasses();

Mesmo com tal uso, você pode usar o cache. Como resultado, os arquivos não modificados não serão analisados repetidamente durante a nova digitalização:

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

// Escaneia diretórios usando um cache
$loader->refresh();

// Retorna matriz de classe => pares de nomes de arquivo
$res = $loader->getIndexedClasses();

Caching

O RobotLoader é muito rápido porque usa o cache de forma inteligente.

Ao se desenvolver com ele, você não tem praticamente nenhuma idéia de que ele corre sobre o fundo. Ele atualiza continuamente o cache porque sabe que classes e arquivos podem ser criados, apagados, renomeados, etc. E ele não escaneia repetidamente arquivos não modificados.

Quando usado em um servidor de produção, por outro lado, recomendamos desativar a atualização do cache usando $loader->setAutoRefresh(false) (isto é feito automaticamente na Aplicação Nette), porque os arquivos não estão mudando. Ao mesmo tempo, é necessário clarar o cache ao fazer o upload de uma nova versão na hospedagem.

Naturalmente, a digitalização inicial dos arquivos, quando o cache ainda não existe, pode levar alguns segundos para aplicações maiores. O RobotLoader tem prevenção embutida contra a “debandada do cache:https://en.wikipedia.org/…che_stampede”. Esta é uma situação em que o servidor de produção recebe um grande número de solicitações simultâneas e como o cache do RobotLoader ainda não existe, todos eles começariam a escanear os arquivos. O que aumenta o uso da CPU e do sistema de arquivos. Felizmente, o RobotLoader trabalha de tal forma que para múltiplas solicitações simultâneas, apenas o primeiro thread indexa os arquivos, cria um cache, os outros esperam, e então usam o cache.

PSR-4

Hoje, o Composer pode ser usado para autocarga em conformidade com o PSR-4. Dito simplesmente, é um sistema onde os namespaces e nomes de classes correspondem à estrutura do diretório e nomes de arquivos, ou seja, App\Router\RouterFactory está localizado no arquivo /path/to/App/Router/RouterFactory.php.

O RobotLoader não está ligado a nenhuma estrutura fixa, portanto, é útil em situações em que não lhe convém ter a estrutura de diretório projetada como namespaces em PHP, ou quando você está desenvolvendo uma aplicação que historicamente não utilizou tais convenções. Também é possível utilizar os dois carregadores em conjunto.

versão: 4.0