Zabojnik Nette DI
Nette DI je ena izmed najbolj zanimivih knjižnic Nette. Ustvari in samodejno posodablja sestavljene vsebnike DI, ki so izjemno hitri in jih je neverjetno enostavno konfigurirati.
Storitve, ki jih ustvarja vsebnik DI, so običajno opredeljene s konfiguracijskimi datotekami v formatu NEON. Zabojnik, ki smo ga ročno ustvarili v prejšnjem razdelku, bi bil zapisan na naslednji način:
parameters:
db:
dsn: 'mysql:'
user: root
password: '***'
services:
- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
- ArticleFactory
- UserController
Zapis je zelo kratek.
Vse odvisnosti, deklarirane v konstruktorjih razredov ArticleFactory
in UserController
, poišče in
posreduje Nette DI sam zaradi tako imenovanega samodejnega
povezovanja, zato v konfiguracijski datoteki ni treba ničesar navajati. Torej tudi če se parametri spremenijo, vam
v konfiguraciji ni treba ničesar spreminjati. Nette bo samodejno regeneriral vsebnik. V njem se lahko osredotočite izključno
na razvoj aplikacije.
Če želite odvisnosti posredovati z uporabo nastavljalcev, za to uporabite nastavitveni razdelek.
Nette DI bo neposredno ustvaril kodo PHP za vsebnik. Rezultat je torej datoteka .php
, ki jo lahko odprete in
preučite. Tako si lahko natančno ogledate, kako deluje vsebnik. Prav tako ga lahko razhroščate v okolju IDE in ga postopoma
pregledujete. In kar je najpomembneje: generirana koda PHP je izjemno hitra.
Nette DI lahko na podlagi priloženega vmesnika ustvari tudi tovarniško kodo. Zato moramo namesto razreda
ArticleFactory
v aplikaciji ustvariti le vmesnik:
interface ArticleFactory
{
function create(): Article;
}
Celoten primer najdete na GitHubu.
Samostojna uporaba
Uporaba knjižnice Nette DI v aplikaciji je zelo preprosta. Najprej jo namestimo s programom Composer (ker je prenašanje datotek zip zelo zastarelo):
composer require nette/di
Naslednja koda ustvari primerek vsebnika DI v skladu s konfiguracijo, shranjeno v datoteki config.neon
:
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;
Zabojnik se ustvari samo enkrat, njegova koda se zapiše v predpomnilnik (imenik __DIR__ . '/temp'
) in se pri
naslednjih zahtevah bere samo od tam.
Za ustvarjanje in pridobivanje storitev se uporabljata metodi getService()
ali getByType()
. Tako
ustvarimo objekt UserController
:
$database = $container->getByType(UserController::class);
$database->query('...');
Med razvojem je koristno vklopiti način samodejnega osveževanja, pri katerem se vsebnik samodejno obnovi, če se spremeni
kateri koli razred ali konfiguracijska datoteka. Samo navedite true
kot drugi argument v konstruktorju
ContainerLoader
.
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);
Uporaba z ogrodjem Nette
Kot smo pokazali, uporaba Nette DI ni omejena na aplikacije, napisane v ogrodju Nette, temveč jo lahko namestite kjer koli s samo tremi vrsticami kode. Če pa razvijate aplikacije v okolju Nette Framework, za konfiguracijo in ustvarjanje vsebnika poskrbi Bootstrap.