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.