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\Presenters\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.

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
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

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
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
versão: 3.x