Como carregar um arquivo de configuração

Os componentes individuais do Nette são configurados usando arquivos de configuração. Mostraremos como carregar esses arquivos.

Se você estiver usando todo o framework, não há necessidade de fazer mais nada. No seu projeto, você tem um diretório config/ pré-preparado para arquivos de configuração, e o carregamento deles é responsabilidade do carregador da aplicação. Este artigo é para usuários que usam apenas uma biblioteca Nette e desejam aproveitar as opções dos arquivos de configuração.

Os arquivos de configuração são geralmente escritos no formato NEON e são melhor editados em editores com suporte a ele. Eles podem ser entendidos como instruções sobre como criar e configurar objetos. Ou seja, o resultado do carregamento da configuração será uma chamada fábrica, que é um objeto que, sob demanda, criará outros objetos que queremos usar. Por exemplo, uma conexão de banco de dados, etc.

Essa fábrica também é chamada de contêiner de injeção de dependência (contêiner DI) e, se você estiver interessado em detalhes, leia o capítulo sobre injeção de dependência.

O carregamento da configuração e a criação do contêiner são feitos pela classe Nette\Bootstrap\Configurator, então primeiro instalaremos seu pacote nette/bootstrap:

composer require nette/bootstrap

E criamos uma instância da classe Configurator. Como o contêiner DI gerado será armazenado em cache no disco, é necessário definir o caminho para o diretório onde ele será salvo:

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

No Linux ou macOS, defina as permissões de escrita para o diretório temp/.

E chegamos aos próprios arquivos de configuração. Nós os carregamos usando addConfig():

$configurator->addConfig(__DIR__ . '/database.neon');

Se quisermos adicionar mais arquivos de configuração, podemos chamar a função addConfig() várias vezes. Se elementos com as mesmas chaves aparecerem nos arquivos, eles serão sobrescritos (ou, no caso de arrays, mesclados). O arquivo inserido posteriormente tem prioridade maior que o anterior.

O último passo é criar o contêiner de DI:

$container = $configurator->createContainer();

E ele já criará os objetos necessários para nós. Por exemplo, se você estiver usando a configuração para Nette Database, pode pedir a ele para criar conexões de banco de dados:

$db = $container->getByType(Nette\Database\Connection::class);
// ou
$explorer = $container->getByType(Nette\Database\Explorer::class);
// ou ao criar múltiplas conexões
$db = $container->getByName('database.main.connection');

E agora você já pode trabalhar com o banco de dados!

Modo de desenvolvimento vs. produção

No modo de desenvolvimento, o contêiner é atualizado automaticamente sempre que os arquivos de configuração são alterados. No modo de produção, ele é gerado apenas uma vez e as alterações não são verificadas. O modo de desenvolvimento é, portanto, focado no máximo conforto do programador, enquanto o modo de produção é focado no desempenho e na implantação em produção.

A seleção do modo é feita por autodetecção, portanto, geralmente não é necessário configurar nada ou alternar manualmente. O modo é de desenvolvimento se a aplicação for executada em localhost (ou seja, endereço IP 127.0.0.1 ou ::1) e não houver proxy presente (ou seja, seu cabeçalho HTTP). Caso contrário, ele é executado no modo de produção.

Se quisermos habilitar o modo de desenvolvimento também em outros casos, por exemplo, para programadores acessando de um endereço IP específico, usamos setDebugMode():

$configurator->setDebugMode('23.75.345.200');
// também pode ser especificado um array de endereços IP

Recomendamos enfaticamente combinar o endereço IP com um cookie. Armazenamos um token secreto no cookie nette-debug, por exemplo, secret1234, e dessa forma ativamos o modo de desenvolvimento para programadores acessando de um endereço IP específico e também tendo o token mencionado no cookie:

$configurator->setDebugMode('secret1234@23.75.345.200');

Também podemos desativar completamente o modo de desenvolvimento, mesmo para localhost:

$configurator->setDebugMode(false);

Parâmetros

Nos arquivos de configuração, você também pode usar parâmetros, que são definidos na seção parameters.

Eles também podem ser inseridos de fora usando o método addDynamicParameters():

$configurator->addDynamicParameters([
	'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);

O parâmetro projectId pode ser referenciado na configuração usando a notação %projectId%.

versão: 3.x