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%
.