Configuración del Contenedor DI

Visión general de las opciones de configuración del contenedor Nette DI.

Fichero de configuración

El contenedor Nette DI es fácil de controlar usando ficheros de configuración. Normalmente están escritos en formato NEON. Recomendamos usar editores con soporte para este formato de edición.

 decorator: Decorator
di: DI Container
extensions: Instalar extensiones DI adicionales
includes: Incluir archivos
parameters: Parámetros
search: Registro automático de servicios
services: Servicios

Si utilizas una cadena que empieza por @ o tiene % en cualquier parte, tienes que escaparla añadiendo otra @ o %.

Parámetros

Puedes definir parámetros que luego se pueden utilizar como parte de las definiciones de servicio. Esto puede ayudar a separar valores que querrás cambiar más regularmente.

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

Puede hacer referencia al parámetro foo mediante %foo% en cualquier otro lugar de cualquier archivo de configuración. También se pueden utilizar dentro de cadenas como '%wwwDir%/images'.

Los parámetros no necesitan ser sólo cadenas, también pueden ser valores de array:

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

Puedes referirte a una sola clave como %mailer.user%.

Si necesitas obtener el valor de algún parámetro en tu código, por ejemplo en tu clase, entonces pásalo a esta clase. Por ejemplo, en el constructor. No existe un objeto de configuración global que pueda consultar a las clases los valores de los parámetros. Esto iría en contra del principio de inyección de dependencias.

Servicios

Ver capítulo aparte.

Decorador

¿Cómo editar masivamente todos los servicios de un determinado tipo? ¿Necesitas llamar a un determinado método para todos los presentadores que heredan de un determinado ancestro común? De ahí surge el decorador.

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

Decorator también se puede utilizar para establecer tags o activar inject mode.

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

DI

Configuración técnica del contenedor DI.

di:
	# shows DIC in Tracy Bar?
	debugger: ...        # (bool) defaults to true

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

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

Exportación de metadatos

La clase contenedor DI también contiene muchos metadatos. Puedes reducirla reduciendo la exportación de metadatos.

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

		# ¿etiquetas de exportación y cuáles?
		tags:               # (string[]|bool) por defecto todos
			- event.subscriber

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

Si no utilizas el array $container->getParameters(), puedes desactivar la exportación de parámetros. Además, puede exportar sólo aquellas etiquetas a través de las cuales obtiene servicios utilizando el método $container->findByTag(...). Si no llama al método en absoluto, puede desactivar completamente la exportación de etiquetas con false.

Puede reducir significativamente los metadatos para autowiring especificando las clases que utiliza como parámetro del método $container->getByType(). Y de nuevo, si no llama al método en absoluto (o sólo en bootstrap para obtener Nette\Application\Application), puede desactivar la exportación completamente con false.

Extensiones

Registro de otras extensiones DI. De esta forma añadimos, por ejemplo, la extensión DI Dibi\Bridges\Nette\DibiExtension22 bajo el nombre dibi:

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Luego lo configuramos en su sección llamada también dibi:

dibi:
	host: localhost

También puedes añadir una clase de extensión con parámetros:

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

Inclusión de archivos

Se pueden insertar ficheros de configuración adicionales en la sección includes:

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

El nombre parameters.php no es una errata, la configuración también se puede escribir en un fichero PHP, que la devuelve como un array:

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

Si elementos con las mismas claves aparecen dentro de ficheros de configuración, serán sobreescritos o fusionados en el caso de arrays. El fichero incluido posteriormente tiene mayor prioridad que el anterior. El fichero en el que aparece la sección includes tiene una prioridad mayor que los ficheros incluidos en él.

La adición automática de servicios al contenedor DI hace el trabajo extremadamente agradable. Nette añade automáticamente presentadores al contenedor, pero usted puede añadir fácilmente cualquier otra clase.

Basta con especificar en qué directorios (y subdirectorios) deben buscarse las clases:

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

Normalmente, sin embargo, no queremos añadir todas las clases e interfaces, así 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 hereden o implementen al menos una de las siguientes clases:

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

También se pueden definir reglas negativas, es decir, máscaras de nombres de clases o ancestros y si las cumplen, el servicio no se añadirá al contenedor DI:

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

Se pueden establecer etiquetas para los servicios añadidos:

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

Fusión

Si aparecen elementos con las mismas claves en más archivos de configuración, se sobrescribirán o fusionarán en el caso de las matrices. El fichero incluido más tarde tiene mayor prioridad.

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

Para evitar la fusión de un determinado array utiliza el signo de exclamación justo después del nombre del array:

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