Configuração do DI Container
Visão geral das opções de configuração para o contêiner Nette DI.
Arquivo de configuração
O recipiente Nette DI é fácil de controlar utilizando arquivos de configuração. Eles são geralmente escritos no formato NEON. Recomendamos utilizar editores com suporte para este formato para edição.
decorator: Decorator
di: DI Container
extensions: Instalar extensões DI adicionais
includes: Incluindo arquivos
parameters: Parâmetros
search: Registro automático de serviço
services: Serviços
Para escrever um texto contendo o caracter %
, you must escape it by doubling it to
%%
.
Parâmetros
Você pode definir parâmetros que podem então ser usados como parte das definições de serviço. Isto pode ajudar a separar valores que você desejará alterar mais regularmente.
parameters:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: secret
Você pode consultar o parâmetro foo
via %foo%
em qualquer outro lugar em qualquer arquivo de
configuração. Eles também podem ser usados dentro de cordas como '%wwwDir%/images'
.
Os parâmetros não precisam ser apenas cordas, eles também podem ser valores de matriz:
parameters:
mailer:
host: smtp.example.com
secure: ssl
user: franta@gmail.com
languages: [cs, en, de]
Você pode consultar a chave única como %mailer.user%
.
Se você precisar obter o valor de qualquer parâmetro em seu código, por exemplo, em sua classe, então passe-o para esta classe. Por exemplo, no construtor. Não há nenhum objeto de configuração global que as classes possam consultar para valores de parâmetros. Isto seria contrário ao princípio de injeção de dependência.
Serviços
Ver capítulo separado.
Decorador
Como editar em massa todos os serviços de um determinado tipo? Precisa chamar um certo método para todos os apresentadores herdados de um determinado antepassado comum? É de lá que vem o decorador.
decorator:
# para todos os serviços que são instâncias desta classe ou interface
App\UI\BasePresenter:
setup:
- setProjectId(10) # chamar este método
- $absoluteUrls = true # e definir a variável
O decorador também pode ser usado para definir etiquetas ou ligar o modo de injeção.
decorator:
InjectableInterface:
tags: [mytag: 1]
inject: true
DI
Configurações técnicas do recipiente DI.
di:
# mostra DIC em Tracy Bar?
debugger: ... # (bool) não é verdadeiro
# tipos de parâmetros que você nunca faz fiação automática
excluded: ... # (string[])
# a classe da qual o recipiente DI herda
parentClass: ... # (string) defaults to Nette\DI\Container
Exportação de Metadados
A classe de contêineres DI também contém um monte de metadados. Você pode reduzi-la reduzindo a exportação de metadados.
di:
export:
# para parâmetros de exportação?
parameters: falso # (bool) padrão para verdadeiro
# etiquetas de exportação e quais?
tags: # (string[]|bool) o padrão é tudo
- event.subscriber
# dados de exportação para fiação automática e quais?
types: # (string[]|bool) o padrão é tudo
- Nette\Database\Connection
- Symfony\Component\Console\Application
Se você não usar a matriz $container->getParameters()
, você pode desativar a exportação de parâmetros.
Além disso, você pode exportar somente as tags através das quais você obtém serviços usando o método
$container->findByTag(...)
. Se você não chamar o método, você pode desabilitar completamente a exportação
de tags com false
.
Você pode reduzir significativamente os metadados para a fiação automática especificando as classes que você usa
como parâmetro para o método $container->getByType()
. E novamente, se você não chamar o método (ou apenas
na bootstrap para obter Nette\Application\Application
),
você pode desativar a exportação inteiramente com false
.
Extensões
Registro de outras extensões de DI. Desta forma, acrescentamos, por exemplo, a extensão DI
Dibi\Bridges\Nette\DibiExtension22
sob o nome dibi
:
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
Em seguida, configuramos na sua seção também chamada dibi
:
dibi:
host: localhost
Você também pode adicionar uma classe de extensão com parâmetros:
extensions:
application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)
Incluindo Arquivos
Arquivos de configuração adicionais podem ser inseridos na seção includes
:
includes:
- parameters.php
- services.neon
- presenters.neon
O nome parameters.php
não é um erro de digitação, a configuração também pode ser escrita em um arquivo
PHP, que a devolve como um array:
<?php
return [
'database' => [
'main' => [
'dsn' => 'sqlite::memory:',
],
],
];
Se itens com as mesmas chaves aparecerem dentro dos arquivos de configuração, eles serão sobrescritos
ou fundidos no caso de arrays. O arquivo incluído posteriormente tem uma prioridade mais alta do que o anterior. O arquivo
no qual a seção includes
é listada tem uma prioridade mais alta do que os arquivos incluídos nela.
Busca
A adição automática de serviços ao contêiner DI torna o trabalho extremamente agradável. A Nette adiciona automaticamente apresentadores ao contêiner, mas você pode adicionar facilmente qualquer outra classe.
Basta especificar em quais diretórios (e subdiretórios) as classes devem ser pesquisadas:
search:
- in: %appDir%/Forms
- in: %appDir%/Model
Normalmente, porém, não queremos acrescentar todas as classes e interfaces, para que possamos filtrá-las:
search:
- in: %appDir%/Forms
# filtragem por nome de arquivo (string|string[])
files:
- *Factory.php
# filtragem por nome de classe (string|string[])
classes:
- *Factory
Ou podemos selecionar classes que herdam ou implementam pelo menos uma das seguintes classes:
search:
- in: %appDir%
extends:
- App\*Form
implements:
- App\*FormInterface
Você também pode definir regras negativas, ou seja, máscaras de nome de classe ou antepassados e, se elas estiverem de acordo, o serviço não será adicionado ao recipiente DI:
search:
- in: %appDir%
exclude:
arquivos: ...
classes: ...
extends: ...
implements: ...
As etiquetas podem ser definidas para serviços adicionais:
search:
- in: %appDir%
tags: ...
Fusão
Se itens com as mesmas chaves aparecerem em mais arquivos de configuração, eles serão sobrescritos ou fundidos no caso de arrays. O arquivo incluído posteriormente tem uma prioridade mais alta.
config1.neon | config2.neon | resultado |
---|---|---|
|
|
|
Para evitar a fusão de uma determinada matriz, use o ponto de exclamação logo após o nome da matriz:
config1.neon | config2.neon | resultado |
---|---|---|
|
|
|