Configuración del Contenedor DI

Resumen de las opciones de configuración para el contenedor Nette DI.

Archivo de configuración

El contenedor Nette DI se controla fácilmente mediante archivos de configuración. Normalmente se escriben en formato NEON. Para la edición, recomendamos editores con soporte para este formato.

 decorator: 	Decorador
di: Contenedor DI
extensions: Instalación de extensiones DI adicionales
includes: Inclusión de archivos
parameters: Parámetros
search: Registro automático de servicios
services: Servicios

Si desea escribir una cadena que contenga el carácter %, debe escaparlo duplicándolo a %%.

Parámetros

En la configuración, puede definir parámetros que luego se pueden usar como parte de las definiciones de servicios. Esto puede aclarar la configuración o unificar y separar valores que cambiarán.

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

Nos referimos al parámetro dsn en cualquier parte de la configuración escribiendo %dsn%. Los parámetros también se pueden usar dentro de cadenas como '%wwwDir%/images'.

Los parámetros no tienen que ser solo cadenas o números, también pueden contener arrays:

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

Nos referimos a una clave específica como %mailer.user%.

Si necesita averiguar el valor de cualquier parámetro en su código, por ejemplo, en una clase, páselo a esa clase. Por ejemplo, en el constructor. No existe un objeto global que represente la configuración al que las clases consultarían los valores de los parámetros. Eso violaría el principio de inyección de dependencias.

Servicios

Ver capítulo separado.

Decorator

¿Cómo modificar masivamente todos los servicios de un tipo determinado? Por ejemplo, ¿llamar a un método específico en todos los presenters que heredan de un ancestro común específico? Para eso está el decorator.

decorator:
	# para todos los servicios que son instancias de esta clase o interfaz
	App\Presentation\BasePresenter:
		setup:
			- setProjectId(10)       # llama a este método
			- $absoluteUrls = true   # y establece la variable

El decorator también se puede usar para configurar tags o activar el modo inject.

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

DI

Configuración técnica del contenedor DI.

di:
	# ¿mostrar DIC en Tracy Bar?
	debugger: ...        # (bool) predeterminado es true

	# tipos de parámetros que nunca autowirear
	excluded: ...        # (string[])

	# ¿permitir la creación lazy de servicios?
	lazy: ...            # (bool) predeterminado es false

	# clase de la que hereda el contenedor DI
	parentClass: ...     # (string) predeterminado es Nette\DI\Container

Servicios lazy

La configuración lazy: true activa la creación lazy (diferida) de servicios. Esto significa que los servicios no se crean realmente en el momento en que los solicitamos del contenedor DI, sino en el momento de su primer uso. Esto puede acelerar el inicio de la aplicación y reducir los requisitos de memoria, ya que solo se crean los servicios que realmente se necesitan en la solicitud dada.

Para un servicio específico, la creación lazy se puede cambiar.

Los objetos lazy solo se pueden usar para clases de usuario, no para clases internas de PHP. Requiere PHP 8.4 o posterior.

Exportación de metadatos

La clase del contenedor DI también contiene muchos metadatos. Puede reducir su tamaño reduciendo la exportación de metadatos.

di:
	export:
		# ¿exportar parámetros?
		parameters: false   # (bool) predeterminado es true

		# ¿exportar tags y cuáles?
		tags:               # (string[]|bool) predeterminados son todos
			- event.subscriber

		# ¿exportar datos para autowiring y cuáles?
		types:              # (string[]|bool) predeterminados son todos
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

Si no utiliza el array $container->getParameters(), puede desactivar la exportación de parámetros. Además, puede exportar solo los tags a través de los cuales obtiene servicios con el método $container->findByTag(...). Si no llama al método en absoluto, puede desactivar completamente la exportación de tags usando false.

Puede reducir significativamente los metadatos para autowiring especificando las clases que usa como parámetro del método $container->getByType(). Y nuevamente, si no llama al método en absoluto (o solo en el bootstrap para obtener Nette\Application\Application), puede desactivar la exportación por completo usando false.

Extensiones

Registro de extensiones DI adicionales. De esta manera, agregamos, por ejemplo, la extensión DI Dibi\Bridges\Nette\DibiExtension22 bajo el nombre dibi

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Posteriormente, la configuramos en la sección dibi:

dibi:
	host: localhost

También se puede agregar como extensión una clase que tiene parámetros:

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

Inclusión de archivos

Podemos incluir otros archivos de configuración en la sección includes:

includes:
	- parameters.php
	- services.neon
	- presenters.neon

El nombre parameters.php no es un error tipográfico, la configuración también se puede escribir en un archivo PHP, que la devuelve como un array:

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

Si aparecen elementos con las mismas claves en los archivos de configuración, se sobrescribirán o, en el caso de arrays, se fusionarán. El archivo incluido posteriormente tiene mayor prioridad que el anterior. El archivo en el que se especifica la sección includes tiene mayor prioridad que los archivos incluidos en él.

La adición automática de servicios al contenedor DI hace que el trabajo sea extremadamente agradable. Nette agrega automáticamente presenters al contenedor, pero también se pueden agregar fácilmente cualquier otra clase.

Simplemente especifique en qué directorios (y subdirectorios) debe buscar clases:

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

Sin embargo, generalmente no queremos agregar absolutamente todas las clases e interfaces, por lo que podemos filtrarlas:

search:
	-	in: %appDir%/Forms

		# filtrado por nombre de archivo (string|string[])
		files:
			- *Factory.php

		# filtrado por nombre de clase (string|string[])
		classes:
			- *Factory

O podemos seleccionar clases que heredan o implementan al menos una de las clases especificadas:

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

También se pueden definir reglas de exclusión, es decir, máscaras de nombre de clase o ancestros hereditarios, que si coinciden, el servicio no se agrega al contenedor DI:

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

Se pueden establecer tags para todos los servicios:

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

Fusión

Si aparecen elementos con las mismas claves en varios archivos de configuración, se sobrescribirán o, en el caso de arrays, se fusionarán. El archivo incluido posteriormente tiene mayor prioridad que el anterior.

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

Para los arrays, se puede evitar la fusión agregando un signo de exclamación después del nombre de la clave:

config1.neon config2.neon resultado
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
versión: 3.x