Ustvarjanje razširitev za Nette DI
Generiranje vsebnika DI poleg konfiguracijskih datotek vpliva tudi na tako imenovane razširitve.
Aktiviramo jih v konfiguracijski datoteki v razdelku extensions
.
Tako dodamo razširitev, ki jo predstavlja razred BlogExtension
z imenom blog
:
Vsaka razširitev za sestavljanje podeduje od Nette\DI\CompilerExtension in lahko implementira naslednje metode, ki se kličejo med sestavljanjem DI:
getConfigSchema(). 2. loadConfiguration() 3. beforeCompile() 4. afterCompile()
getConfigSchema()
Ta metoda se pokliče prva. Opredeljuje shemo, ki se uporablja za preverjanje konfiguracijskih parametrov.
Razširitve se konfigurirajo v razdelku, katerega ime je enako tistemu, pod katerim je bila razširitev dodana, npr.
blog
.
Opredelili bomo shemo, ki opisuje vse možnosti konfiguracije, vključno z njihovimi vrstami, sprejetimi vrednostmi in po možnosti privzetimi vrednostmi:
Za dokumentacijo glejte shemo. Poleg tega lahko določite, katere možnosti so lahko
dinamične z uporabo dynamic()
, na
primer Expect::int()->dynamic()
.
Do konfiguracije dostopamo prek $this->config
, ki je objekt stdClass
:
loadConfiguration()
Ta metoda se uporablja za dodajanje storitev v vsebnik. To storimo s Nette\DI\ContainerBuilder:
Običajno se storitve, ki jih doda razširitev, opremijo z njenim imenom, tako da ne pride do navzkrižja imen. To stori
prefix()
, tako da če se razširitev imenuje „blog“, se bo storitev imenovala blog.articles
.
Če moramo storitev preimenovati, lahko ustvarimo vzdevek z njenim prvotnim imenom, da ohranimo združljivost za nazaj.
Podobno stori Nette npr. za routing.router
, ki je na voljo tudi pod prejšnjim imenom router
.
Pridobivanje storitev iz datoteke
Storitve lahko ustvarimo z uporabo API ContainerBuilder, lahko pa jih dodamo tudi prek znane konfiguracijske datoteke NEON in
njenega razdelka services
. Predpona @extension
predstavlja trenutno razširitev.
Storitve bomo dodajali na ta način:
beforeCompile()
Metoda se pokliče, ko vsebnik vsebuje vse storitve, ki so jih dodale posamezne razširitve v metodah
loadConfiguration
, in uporabniške konfiguracijske datoteke. V tej fazi sestavljanja lahko nato spreminjamo
definicije storitev ali dodajamo povezave med njimi. Za iskanje storitev po oznakah lahko uporabite metodo
findByTag()
, za iskanje po razredih ali vmesnikih pa metodo findByType()
.
afterCompile()
V tej fazi je razred vsebnika že ustvarjen kot objekt ClassType, vsebuje vse metode, ki jih ustvari storitev, in je pripravljen za predpomnjenje kot datoteka PHP. Na tej točki lahko še vedno urejamo kodo nastalega razreda.
$initialization
Konfigurator pokliče inicializacijsko kodo po ustvarjanju
vsebnika, ki se ustvari z zapisom v objekt $this->initialization
z metodo addBody().
Prikazali bomo primer, kako z inicializacijsko kodo zaženemo sejo ali zaženemo storitve, ki imajo oznako
run
: