Nette Documentation Preview

syntax
Contenedor DI de Nette
**********************

.[perex]
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|neon:format]. El contenedor que creamos manualmente en el [capítulo anterior|container] se escribiría así:

```neon
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|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 |services#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|factory] basándose en la interfaz proporcionada. Por lo tanto, en lugar de la clase `ArticleFactory`, solo necesitaremos crear una interfaz en la aplicación:

```php
interface ArticleFactory
{
	function create(): Article;
}
```

Puede encontrar el ejemplo completo [en GitHub|https://github.com/nette-examples/di-example-doc].


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):

```shell
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`:

```php
$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`:

```php
$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`.

```php
$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 |application:bootstrapping#Configuración del contenedor DI].

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.