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.
Search
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 |
---|---|---|
|
|
|
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 |
---|---|---|
|
|
|