Nette DI Vsebnik
Nette DI je ena izmed najbolj zanimivih knjižnic Nette. Zna generirati in samodejno posodabljati prevedene DI vsebnike, ki so izjemno hitri in neverjetno enostavni za konfiguracijo.
Podobo storitev, ki jih mora ustvarjati DI vsebnik, definiramo običajno s pomočjo konfiguracijskih datotek v formatu NEON. Vsebnik, ki smo ga ročno ustvarili v prejšnjem poglavju, bi se zapisal takole:
parameters:
db:
dsn: 'mysql:'
user: root
password: '***'
services:
- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
- ArticleFactory
- UserController
Zapis je resnično kratek.
Vse odvisnosti, deklarirane v konstruktorjih razredov ArticleFactory
in UserController
, si Nette DI
sam ugotovi in preda zahvaljujoč t.i. autowiringu,
v konfiguracijski datoteki zato ni treba ničesar navajati. Torej tudi če pride do spremembe parametrov, vam ni treba
v konfiguraciji ničesar spreminjati. Nette vsebnik samodejno pregenerira. Vi se lahko tam osredotočite izključno na razvoj
aplikacije.
Če želimo odvisnosti predajati s pomočjo setterjev, uporabimo za to sekcijo setup.
Nette DI generira neposredno PHP kodo vsebnika. Rezultat je torej datoteka .php
, ki jo lahko odprete in
preučujete. Zahvaljujoč temu natančno vidite, kako vsebnik deluje. Lahko ga tudi razhroščujete v IDE in korakate skozi. In
predvsem: generirana PHP koda je izjemno hitra.
Nette DI zna tudi generirati kodo tovarn na podlagi
posredovanega vmesnika. Zato namesto razreda ArticleFactory
bo zadostovalo ustvariti v aplikaciji le vmesnik:
interface ArticleFactory
{
function create(): Article;
}
Celoten primer najdete na GitHubu.
Samostojna uporaba
Uvedba knjižnice Nette DI v aplikacijo je zelo enostavna. Najprej jo namestimo s Composerjem (ker je prenašanje zipov taaaako zastarelo):
composer require nette/di
Naslednja koda ustvari instanco DI vsebnika glede na 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;
Vsebnik se generira le enkrat, njegova koda se zapiše v predpomnilnik (imenik __DIR__ . '/temp'
) in pri
naslednjih zahtevah se le še od tam naloži.
Za ustvarjanje in pridobivanje storitev služita metodi getService()
ali getByType()
. Tako ustvarimo
objekt UserController
:
$controller = $container->getByType(UserController::class);
$controller->someMethod();
Med razvojem je koristno aktivirati način samodejnega osveževanja, ko se vsebnik samodejno pregenerira, če pride do
spremembe kateregakoli razreda ali konfiguracijske datoteke. Zadostuje, da v konstruktorju ContainerLoader
navedete
kot drugi argument true
.
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);
Uporaba z ogrodjem Nette
Kot smo pokazali, uporaba Nette DI ni omejena na aplikacije, napisane v Nette Frameworku, lahko ga s pomočjo le 3 vrstic kode uvedete kjerkoli. Če pa razvijate aplikacije v Nette Frameworku, ima konfiguracijo in ustvarjanje vsebnika na skrbi Bootstrap.