Opredelitve storitev
Konfiguracija je mesto, kjer vsebniku DI naročimo, kako naj sestavi posamezne storitve in kako naj jih poveže z drugimi odvisnostmi. Nette ponuja zelo jasen in eleganten način za doseganje tega cilja.
V razdelku services
v konfiguracijski datoteki NEON opredelimo svoje storitve po meri in njihove konfiguracije.
Oglejmo si preprost primer opredelitve storitve z imenom database
, ki predstavlja primerek razreda
PDO
:
Rezultat te konfiguracije je naslednja tovarniška metoda v vsebniku DI:
Imena storitev nam omogočajo sklicevanje nanje v drugih delih konfiguracijske datoteke v obliki @serviceName
.
Če storitve ni treba poimenovati, lahko preprosto uporabimo točko:
Za pridobitev storitve iz vsebnika DI lahko uporabimo metodo getService()
z imenom storitve kot parametrom ali
metodo getByType()
s tipom storitve:
Ustvarjanje storitev
Najpogosteje ustvarimo storitev tako, da instanciramo določen razred. Na primer:
Če moramo konfiguracijo razširiti z dodatnimi ključi, lahko definicijo razširimo v več vrstic:
Ključ create
ima vzdevek factory
, obe različici sta v praksi pogosti. Vendar priporočamo uporabo
ključa create
.
Argumente konstruktorja ali metodo ustvarjanja lahko alternativno zapišete v ključu arguments
:
Storitve niso nujno ustvarjene samo z enostavno instanciacijo razreda; lahko so tudi posledica klica statičnih metod ali metod drugih storitev:
Upoštevajte, da zaradi enostavnosti namesto ->
uporabljamo ::
, glej izrazna sredstva. Te tovarniške metode so ustvarjene:
vsebnik DI mora poznati vrsto ustvarjene storitve. Če ustvarimo storitev z metodo, ki nima določene vrnitvene vrste, moramo to vrsto izrecno navesti v konfiguraciji:
Argumenti
Argumente konstruktorjem in metodam posredujemo na zelo podoben način kot v običajnem jeziku PHP:
Za boljšo berljivost lahko argumente navedemo v ločenih vrsticah. V tej obliki je uporaba vejic neobvezna:
Argumente lahko tudi poimenujete, kar vam omogoča, da se ne ukvarjate z njihovim vrstnim redom:
Če želite določene argumente izpustiti in uporabiti njihove privzete vrednosti ali vstaviti storitev prek samodejnega napeljevanja, uporabite podčrtaj:
Argumenti so lahko storitve, parametri in še veliko več, glejte izrazna sredstva.
Nastavitev
V razdelku setup
opredelimo metode, ki jih je treba poklicati pri ustvarjanju storitve.
V jeziku PHP bi bilo to videti takole:
Poleg klicev metod lahko lastnostim posredujete tudi vrednosti. Podprto je tudi dodajanje elementa v polje, vendar ga morate zapreti v narekovaje, da ne pride do kolizije s sintakso NEON:
V jeziku PHP bi to pomenilo:
V nastavitvi lahko kličete tudi statične metode ali metode drugih storitev. Če morate kot argument posredovati trenutno
storitev, uporabite @self
:
Upoštevajte, da zaradi enostavnosti namesto ->
uporabimo ::
, glejte izrazna sredstva. To ustvari naslednjo tovarniško metodo:
Sredstva za izražanje
Nette DI nam zagotavlja izjemno bogate izrazne možnosti, s katerimi lahko izrazimo skoraj vse. V konfiguracijskih datotekah lahko uporabljamo parametre:
Prav tako lahko ustvarjamo predmete, kličemo metode in funkcije:
Na storitve se lahko sklicujemo po imenu ali vrsti:
Uporabite sintakso prvega razreda za klicanje:
Uporabite konstante:
Tako kot v PHP lahko klice metod verižite. Zaradi preprostosti namesto ->
uporabimo ::
:
Te izraze lahko pri ustvarjanju storitev uporabite kjer koli, v argumentih, v nastavitvenem delu ali parametrih:
Posebne funkcije
V konfiguracijskih datotekah lahko uporabite te posebne funkcije:
not()
za zanikanje vrednostibool()
,int()
,float()
,string()
za brezizgubno ulivanje tipovtyped()
za ustvarjanje polja vseh storitev določenega tipatagged()
za ustvarjanje polja vseh storitev z določeno oznako
V primerjavi z običajnim tipiziranjem v PHP, kot je (int)
, bo brezizgubno tipiziranje vrglo izjemo za
neštevilčne vrednosti.
Funkcija typed()
ustvari polje vseh storitev določene vrste (razreda ali vmesnika). Izključuje storitve
z izklopljenim samodejnim vgrajevanjem. Določite lahko več vrst, ki jih ločite z vejicami.
Kot argument lahko samodejno posredujete tudi polje storitev določene vrste z uporabo samodejnega napeljevanja.
Funkcija tagged()
ustvari polje vseh storitev z določeno oznako. Navedete lahko več oznak, ki jih ločite
z vejicami.
Avtomatska napeljava
Ključ autowired
omogoča spreminjanje obnašanja samodejnega ožičenja za določeno storitev. Za več
podrobnosti glejte poglavje o samodejnem ožičenju.
Lene storitve
Leno nalaganje je tehnika, ki odloži ustvarjanje storitve, dokler je ta dejansko potrebna. Leno ustvarjanje storitev lahko omogočite globalno v konfiguraciji za vse storitve hkrati. Za posamezne storitve lahko to obnašanje prekrijete:
Če je storitev opredeljena kot lena, bo zahteva iz vsebnika DI vrnila poseben objekt posrednika. Ta posrednik je videti in se obnaša kot dejanska storitev, vendar se prava inicializacija (klic konstruktorja in nastavitev) izvede šele ob prvem klicu katere koli njene metode ali lastnosti.
Leno nalaganje je mogoče uporabiti le za uporabniško definirane razrede, ne pa tudi za notranje razrede PHP. Zahteva PHP 8.4 ali novejšo različico.
Oznake
Oznake se uporabljajo za dodajanje dodatnih informacij storitvam. Storitvi lahko dodelite eno ali več oznak:
Oznake lahko nosijo tudi vrednosti:
Če želite priklicati vse storitve z določenimi oznakami, lahko uporabite funkcijo tagged()
:
V vsebniku DI lahko z metodo findByTag()
pridobite imena vseh storitev z določeno oznako:
Način vbrizgavanja
Uporaba oznake inject: true
aktivira posredovanje odvisnosti prek javnih spremenljivk z opombo inject in metodami inject*( ).
Privzeto je funkcija inject
aktivirana samo za predstavnike.
Spremembe storitev
Vsebnik DI vsebuje številne storitve, ki so dodane z vgrajenimi ali uporabniškimi
razširitvami. Definicije teh storitev lahko spreminjate neposredno v konfiguraciji. Tako lahko na primer spremenite razred
storitve application.application
, ki je običajno Nette\Application\Application
, v drug razred:
Oznaka alteration
je informativna in pomeni, da zgolj spreminjamo obstoječo storitev.
Nastavitev lahko tudi dopolnimo:
Pri prepisovanju storitve boste morda želeli odstraniti prvotne argumente, nastavitvene elemente ali oznake, pri čemer vam
pride prav reset
:
Če želite odstraniti storitev, ki jo je dodala razširitev, lahko to storite na naslednji način: