Configuração do Contêiner DI

Visão geral das opções de configuração para o contêiner Nette DI.

Arquivo de Configuração

O contêiner Nette DI é facilmente controlado por meio de arquivos de configuração. Eles geralmente são escritos no formato NEON. Para edição, recomendamos editores com suporte para este formato.

 decorator: 	Decorador
di: Contêiner DI
extensions: Instalação de extensões DI adicionais
includes: Inclusão de arquivos
parameters: Parâmetros
search: Registro automático de serviços
services: Serviços

Para escrever uma string contendo o caractere %, você deve escapá-lo duplicando-o para %%.

Parâmetros

Na configuração, você pode definir parâmetros que podem ser usados como parte das definições de serviço. Isso pode tornar a configuração mais clara ou unificar e extrair valores que serão alterados.

parameters:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: secret

Referimo-nos ao parâmetro dsn em qualquer lugar na configuração escrevendo %dsn%. Os parâmetros também podem ser usados dentro de strings como '%wwwDir%/images'.

Os parâmetros não precisam ser apenas strings ou números, eles também podem conter arrays:

parameters:
	mailer:
		host: smtp.example.com
		secure: ssl
		user: franta@gmail.com
	languages: [cs, en, de]

Referimo-nos a uma chave específica como %mailer.user%.

Se você precisar descobrir o valor de qualquer parâmetro em seu código, por exemplo, em uma classe, passe-o para essa classe. Por exemplo, no construtor. Não existe um objeto global representando a configuração que as classes consultariam para obter valores de parâmetros. Isso violaria o princípio da injeção de dependência.

Serviços

Veja capítulo separado.

Decorator

Como modificar em massa todos os serviços de um determinado tipo? Por exemplo, chamar um determinado método em todos os presenters que herdam de um ancestral comum específico? É para isso que serve o decorator.

decorator:
	# para todos os serviços que são instâncias desta classe ou interface
	App\Presentation\BasePresenter:
		setup:
			- setProjectId(10)       # chame este método
			- $absoluteUrls = true   # e defina a variável

O decorator também pode ser usado para definir tags ou ativar o modo inject.

decorator:
	InjectableInterface:
		tags: [mytag: 1]
		inject: true

DI

Configurações técnicas do contêiner DI.

di:
	# exibir DIC na Tracy Bar?
	debugger: ...        # (bool) padrão é true

	# tipos de parâmetros que nunca devem ser autowired
	excluded: ...        # (string[])

	# permitir criação lazy de serviços?
	lazy: ...            # (bool) padrão é false

	# classe da qual o contêiner DI herda
	parentClass: ...     # (string) padrão é Nette\DI\Container

Serviços Lazy

A configuração lazy: true ativa a criação lazy (adiada) de serviços. Isso significa que os serviços não são realmente criados no momento em que os solicitamos do contêiner DI, mas apenas no momento de seu primeiro uso. Isso pode acelerar o início da aplicação e reduzir o consumo de memória, pois apenas os serviços que são realmente necessários na requisição atual são criados.

Para um serviço específico, a criação lazy pode ser alterada.

Objetos lazy só podem ser usados para classes de usuário, não para classes internas do PHP. Requer PHP 8.4 ou posterior.

Exportação de metadados

A classe do contêiner DI também contém muitos metadados. Você pode reduzi-la reduzindo a exportação de metadados.

di:
	export:
		# exportar parâmetros?
		parameters: false   # (bool) padrão é true

		# exportar tags e quais?
		tags:               # (string[]|bool) padrão são todas
			- event.subscriber

		# exportar dados para autowiring e quais?
		types:              # (string[]|bool) padrão são todas
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

Se você não usa o array $container->getParameters(), pode desativar a exportação de parâmetros. Além disso, você pode exportar apenas as tags pelas quais obtém serviços usando o método $container->findByTag(...). Se você não chamar o método, pode desativar completamente a exportação de tags usando false.

Você pode reduzir significativamente os metadados para autowiring especificando as classes que você usa como parâmetro do método $container->getByType(). E novamente, se você não chamar o método (respectivamente, apenas no bootstrap para obter Nette\Application\Application), pode desativar completamente a exportação usando false.

Extensões

Registro de extensões DI adicionais. Desta forma, adicionamos, por exemplo, a extensão DI Dibi\Bridges\Nette\DibiExtension22 sob o nome dibi

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Posteriormente, a configuramos na seção dibi:

dibi:
	host: localhost

Também é possível adicionar uma classe que tem parâmetros como extensão:

extensions:
	application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)

Inclusão de arquivos

Podemos incluir outros arquivos de configuração 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 retorna como um array:

<?php
return [
	'database' => [
		'main' => [
			'dsn' => 'sqlite::memory:',
		],
	],
];

Se elementos com as mesmas chaves aparecerem em vários arquivos de configuração, eles serão sobrescritos ou, no caso de arrays, mesclados. O arquivo incluído posteriormente tem prioridade maior que o anterior. O arquivo no qual a seção includes está listada tem prioridade maior que os arquivos incluídos nele.

A adição automática de serviços ao contêiner DI torna o trabalho extremamente agradável. Nette adiciona automaticamente presenters ao contêiner, mas também é fácil adicionar quaisquer outras classes.

Basta especificar em quais diretórios (e subdiretórios) as classes devem ser procuradas:

search:
	-	in: %appDir%/Forms
	-	in: %appDir%/Model

No entanto, geralmente não queremos adicionar absolutamente todas as classes e interfaces, por isso podemos 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 classes listadas:

search:
	-	in: %appDir%
		extends:
			- App\*Form
		implements:
			- App\*FormInterface

Também é possível definir regras de exclusão, ou seja, máscaras de nome de classe ou ancestrais herdados, que, se corresponderem, o serviço não será adicionado ao contêiner DI:

search:
	-	in: %appDir%
		exclude:
			files: ...
			classes: ...
			extends: ...
			implements: ...

Tags podem ser definidas para todos os serviços:

search:
	-	in: %appDir%
		tags: ...

Mesclagem

Se elementos com as mesmas chaves aparecerem em vários arquivos de configuração, eles serão sobrescritos ou, no caso de arrays, mesclados. O arquivo incluído posteriormente tem prioridade maior que o anterior.

config1.neon config2.neon resultado
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

Para arrays, a mesclagem pode ser evitada adicionando um ponto de exclamação após o nome da chave:

config1.neon config2.neon resultado
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
versão: 3.x