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.