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.
Búsqueda
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 |
---|---|---|
|
|
|
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 |
---|---|---|
|
|
|