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.

različica: 3.x