Nette DI Container

Nette DI este una dintre cele mai interesante biblioteci Nette. Poate genera și actualiza automat containere DI compilate, care sunt extrem de rapide și uimitor de ușor de configurat.

Forma serviciilor pe care containerul DI trebuie să le creeze o definim de obicei folosind fișiere de configurație în format NEON. Containerul pe care l-am creat manual în capitolul anterior s-ar scrie astfel:

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

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

Notația este într-adevăr concisă.

Toate dependențele declarate în constructorii claselor ArticleFactory și UserController, Nette DI le descoperă și le transmite singur datorită așa-numitului autowiring, de aceea nu este nevoie să se specifice nimic în fișierul de configurație. Astfel, chiar dacă parametrii se schimbă, nu trebuie să modificați nimic în configurație. Containerul Nette se regenerează automat. Vă puteți concentra astfel exclusiv pe dezvoltarea aplicației.

Dacă dorim să transmitem dependențe folosind setteri, folosim secțiunea setup pentru aceasta.

Nette DI generează direct cod PHP pentru container. Rezultatul este deci un fișier .php, pe care îl puteți deschide și studia. Datorită acestui fapt, vedeți exact cum funcționează containerul. Îl puteți de asemenea depana în IDE și parcurge pas cu pas. Și cel mai important: PHP-ul generat este extrem de rapid.

Nette DI poate genera și cod pentru fabrici pe baza interfeței furnizate. De aceea, în loc de clasa ArticleFactory, ne va fi suficient să creăm în aplicație doar o interfață:

interface ArticleFactory
{
	function create(): Article;
}

Exemplul complet îl găsiți pe GitHub.

Utilizare independentă

Implementarea bibliotecii Nette DI într-o aplicație este foarte ușoară. Mai întâi o instalăm cu Composer (pentru că descărcarea arhivelor zip este așaaa de învechită):

composer require nette/di

Următorul cod creează o instanță a containerului DI conform configurației stocate în fișierul config.neon:

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

Containerul se generează o singură dată, codul său se scrie în cache (directorul __DIR__ . '/temp') și la cererile ulterioare se încarcă doar de aici.

Pentru crearea și obținerea serviciilor se folosesc metodele getService() sau getByType(). Astfel creăm obiectul UserController:

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

În timpul dezvoltării este util să activăm modul auto-refresh, în care containerul se regenerează automat dacă se modifică orice clasă sau fișier de configurație. Este suficient să specificăm true ca al doilea argument în constructorul ContainerLoader.

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

Utilizare cu framework-ul Nette

Așa cum am arătat, utilizarea Nette DI nu este limitată la aplicațiile scrise în Nette Framework, îl puteți implementa oriunde cu doar 3 rânduri de cod. Dacă însă dezvoltați aplicații în Nette Framework, configurarea și crearea containerului sunt gestionate de Bootstrap.

versiune: 3.x