Nette DI Container

Nette DI è una delle librerie più interessanti di Nette. Può generare e aggiornare automaticamente container DI compilati, che sono estremamente veloci e incredibilmente facili da configurare.

La forma dei servizi che il container DI deve creare viene solitamente definita tramite file di configurazione nel formato NEON. Il container che abbiamo creato manualmente nel capitolo precedente sarebbe scritto così:

parameters:
	db:
		dsn: 'mysql:'
		user: root
		password: '***'

services:
	- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
	- ArticleFactory
	- UserController

La scrittura è davvero concisa.

Tutte le dipendenze dichiarate nei costruttori delle classi ArticleFactory e UserController vengono rilevate e passate automaticamente da Nette DI grazie al cosiddetto autowiring, quindi non è necessario specificare nulla nel file di configurazione. Quindi, anche se i parametri cambiano, non è necessario modificare nulla nella configurazione. Il container Nette si rigenera automaticamente. Puoi concentrarti esclusivamente sullo sviluppo dell'applicazione.

Se vogliamo passare le dipendenze tramite setter, usiamo la sezione setup.

Nette DI genera direttamente il codice PHP del container. Il risultato è quindi un file .php che puoi aprire e studiare. Grazie a ciò, vedi esattamente come funziona il container. Puoi anche eseguirne il debug nell'IDE e fare lo step-by-step. E soprattutto: il PHP generato è estremamente veloce.

Nette DI può anche generare codice per le factory basate sull'interfaccia fornita. Pertanto, invece della classe ArticleFactory, basterà creare solo un'interfaccia nell'applicazione:

interface ArticleFactory
{
	function create(): Article;
}

L'esempio completo è disponibile su GitHub.

Utilizzo indipendente

Implementare la libreria Nette DI in un'applicazione è molto semplice. Prima la installiamo con Composer (perché scaricare zip è coooosì obsoleto):

composer require nette/di

Il seguente codice crea un'istanza del container DI secondo la configurazione salvata nel file config.neon:

$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
	$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;

Il container viene generato solo una volta, il suo codice viene scritto nella cache (directory __DIR__ . '/temp') e nelle richieste successive viene semplicemente caricato da lì.

Per creare e ottenere servizi si usano i metodi getService() o getByType(). In questo modo creiamo l'oggetto UserController:

$controller = $container->getByType(UserController::class);
$controller->someMethod();

Durante lo sviluppo, è utile attivare la modalità di auto-refresh, in cui il container si rigenera automaticamente se viene modificata una qualsiasi classe o file di configurazione. Basta specificare true come secondo argomento nel costruttore di ContainerLoader.

$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);

Utilizzo con Nette Framework

Come abbiamo mostrato, l'uso di Nette DI non è limitato alle applicazioni scritte in Nette Framework, puoi implementarlo ovunque con sole 3 righe di codice. Tuttavia, se sviluppi applicazioni in Nette Framework, la configurazione e la creazione del container sono gestite da Bootstrap.

versione: 3.x