Contenedor DI de Nette
Nette DI es una de las librerías más interesantes de Nette. Puede generar y actualizar automáticamente contenedores DI compilados, que son extremadamente rápidos y sorprendentemente fáciles de configurar.
La forma de los servicios que debe crear el contenedor DI se define generalmente mediante archivos de configuración en formato NEON. El contenedor que creamos manualmente en el capítulo anterior se escribiría así:
parameters:
db:
dsn: 'mysql:'
user: root
password: '***'
services:
- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
- ArticleFactory
- UserController
La notación es realmente concisa.
Todas las dependencias declaradas en los constructores de las clases ArticleFactory
y UserController
son detectadas y pasadas automáticamente por Nette DI gracias al llamado autowiring, por lo que no es necesario especificar nada en el
archivo de configuración. Así que incluso si los parámetros cambian, no necesita cambiar nada en la configuración. Nette
regenerará automáticamente el contenedor. Puede concentrarse puramente en el desarrollo de la aplicación.
Si queremos pasar dependencias mediante setters, usamos la sección setup para ello.
Nette DI genera directamente el código PHP del contenedor. El resultado es, por tanto, un archivo .php
que puede
abrir y estudiar. Gracias a esto, puede ver exactamente cómo funciona el contenedor. También puede depurarlo en su IDE y
recorrerlo paso a paso. Y lo más importante: el PHP generado es extremadamente rápido.
Nette DI también puede generar código de fábricas
basándose en la interfaz proporcionada. Por lo tanto, en lugar de la clase ArticleFactory
, solo necesitaremos crear
una interfaz en la aplicación:
interface ArticleFactory
{
function create(): Article;
}
Puede encontrar el ejemplo completo en GitHub.
Uso independiente
Implementar la librería Nette DI en una aplicación es muy fácil. Primero, la instalamos con Composer (porque descargar zips es taaan anticuado):
composer require nette/di
El siguiente código crea una instancia del contenedor DI según la configuración almacenada en el archivo
config.neon
:
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;
El contenedor se genera solo una vez, su código se escribe en la caché (directorio __DIR__ . '/temp'
) y en las
siguientes peticiones simplemente se carga desde allí.
Para crear y obtener servicios, se utilizan los métodos getService()
o getByType()
. Así creamos el
objeto UserController
:
$controller = $container->getByType(UserController::class);
$controller->someMethod();
Durante el desarrollo, es útil activar el modo de auto-refresco, donde el contenedor se regenera automáticamente si se cambia
alguna clase o archivo de configuración. Simplemente proporcione true
como segundo argumento en el constructor de
ContainerLoader
.
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);
Uso con el framework Nette
Como hemos mostrado, el uso de Nette DI no está limitado a aplicaciones escritas en Nette Framework, puede implementarlo en cualquier lugar con solo 3 líneas de código. Sin embargo, si desarrolla aplicaciones en Nette Framework, la configuración y creación del contenedor está a cargo de Bootstrap.