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.