Szolgáltatás meghatározások
A konfiguráció az a hely, ahol utasítjuk a DI konténert, hogyan állítsa össze az egyes szolgáltatásokat, és hogyan kapcsolja össze őket más függőségekkel. A Nette egy nagyon világos és elegáns módot biztosít erre.
A NEON konfigurációs fájl services
szakasza az a hely, ahol definiáljuk az egyéni szolgáltatásainkat és
azok konfigurációit. Nézzünk egy egyszerű példát a database
nevű szolgáltatás definiálására, amely a
PDO
osztály egy példányát képviseli:
Ez a konfiguráció a következő gyári metódust eredményezi a DI konténerben:
A szolgáltatásnevek lehetővé teszik, hogy a konfigurációs fájl más részeiben hivatkozzunk rájuk a
@serviceName
formátumban. Ha nincs szükség a szolgáltatás elnevezésére, akkor egyszerűen használhatunk egy
felsorolásjelet:
Egy szolgáltatás lekérdezéséhez a DI konténerből a getService()
metódust használhatjuk a szolgáltatás
nevével paraméterként, vagy a getByType()
metódust a szolgáltatás típusával:
Szolgáltatás létrehozása
Leggyakrabban egy szolgáltatást egyszerűen egy adott osztály példányosításával hozunk létre. Például:
Ha a konfigurációt további kulcsokkal kell bővítenünk, a definíciót több sorban is kibővíthetjük:
A create
kulcsnak van egy aliasa: factory
, mindkét változat gyakori a gyakorlatban. Javasoljuk
azonban a create
használatát.
A konstruktor argumentumai vagy a létrehozási módszer alternatívaként a arguments
kulcsban is
leírhatók:
A szolgáltatásokat nem csak egy osztály egyszerű példányosításával kell létrehozni; létrejöhetnek statikus metódusok vagy más szolgáltatások metódusainak hívásából is:
Megjegyezzük, hogy az egyszerűség kedvéért a ->
helyett a ::
használjuk, lásd a kifejezés eszközeit. Ezeket a gyári metódusokat generáljuk:
A DI konténernek tudnia kell a létrehozott szolgáltatás típusát. Ha olyan metódussal hozunk létre egy szolgáltatást, amelynek nincs megadott visszatérési típusa, akkor ezt a típust kifejezetten meg kell említenünk a konfigurációban:
Érvek
A konstruktoroknak és metódusoknak a hagyományos PHP-hoz nagyon hasonló módon adunk át argumentumokat:
A jobb olvashatóság érdekében az argumentumokat külön sorokban is felsorolhatjuk. Ebben a formátumban a vesszők használata opcionális:
Az argumentumokat el is nevezhetjük, így nem kell aggódnunk a sorrendjük miatt:
Ha bizonyos argumentumokat el akar hagyni, és azok alapértelmezett értékét kívánja használni, vagy egy szolgáltatást automatikus bekötéssel szeretne beilleszteni, használjon aláhúzást:
Az argumentumok lehetnek szolgáltatások, paraméterek és még sok más, lásd a kifejezés eszközeit.
Beállítás
A setup
szakaszban definiáljuk azokat a metódusokat, amelyeket a szolgáltatás létrehozásakor meg
kell hívni.
PHP nyelven ez így nézne ki:
A metódushívások mellett értékeket is átadhat a tulajdonságoknak. Egy elem hozzáadása egy tömbhöz szintén támogatott, de azt idézőjelek közé kell zárni, hogy ne ütközzön a NEON szintaxissal:
PHP-ben ez a következőképpen hangzana:
A beállításban statikus módszereket vagy más szolgáltatások metódusait is meghívhatja. Ha az aktuális
szolgáltatást kell átadni argumentumként, használja a @self
címet:
Vegye figyelembe, hogy az egyszerűség kedvéért a ->
helyett a ::
, lásd a kifejezés eszközeit. Ez a következő gyári metódust generálja:
Kifejezés Eszközök
A Nette DI kivételesen gazdag kifejezési lehetőségeket biztosít számunkra, lehetővé téve számunkra, hogy szinte bármit megfogalmazzunk. A konfigurációs fájlokban használhatunk paramétereket:
Objektumokat is létrehozhatunk, metódusokat és függvényeket hívhatunk:
A szolgáltatásokra a nevük vagy a típusuk alapján hivatkozhatunk:
Első osztályú hívható szintaxis használata:
Konstanciák használata:
A metódushívások láncolhatók, akárcsak a PHP-ban. Az egyszerűség kedvéért a ->
helyett a
::
címet használjuk:
Ezek a kifejezések bárhol használhatók a szolgáltatások létrehozásakor, az argumentumokban, a beállítási szakaszban vagy a paraméterekben:
Különleges funkciók
A konfigurációs fájlokon belül használhatja ezeket a speciális funkciókat:
not()
az érték negációjáhozbool()
,int()
,float()
,string()
a veszteségmentes típusváltáshoz.typed()
a megadott típusú szolgáltatások tömbjének létrehozásához.tagged()
egy adott címkével rendelkező összes szolgáltatás tömbjének létrehozásához.
A PHP hagyományos típuskiosztásához képest, mint például a (int)
, a veszteségmentes típuskiosztás
kivételt dob a nem numerikus értékek esetén.
A typed()
függvény egy adott típusú (osztály vagy interfész) összes szolgáltatásának tömbjét hozza
létre. Kizárja azokat a szolgáltatásokat, amelyeknél az automatikus kapcsolás ki van kapcsolva. Több típus is megadható,
vesszővel elválasztva.
Az autowiring használatával egy adott típusú szolgáltatások tömbjét is automatikusan átadhatja argumentumként.
A tagged()
függvény létrehozza a megadott címkével rendelkező összes szolgáltatás tömbjét. Több címke
is felsorolható, vesszővel elválasztva.
Autowiring
A autowired
billentyűvel módosíthatja egy adott szolgáltatás autowiring viselkedését. További
részletekért lásd az autowiring fejezetet.
Lusta szolgáltatások
A lusta betöltés egy olyan technika, amely a szolgáltatás létrehozását addig késlelteti, amíg arra ténylegesen szükség van. A lusta szolgáltatás létrehozását globálisan engedélyezheti a konfigurációban az összes szolgáltatás számára egyszerre. Az egyes szolgáltatások esetében ez a viselkedés felülbírálható:
Ha egy szolgáltatás lusta szolgáltatásként van definiálva, akkor a DI konténerből történő lekérdezés egy speciális proxy objektumot fog visszaadni. Ez a proxy úgy néz ki és úgy viselkedik, mint a tényleges szolgáltatás, de a valódi inicializálás (konstruktorhívás és beállítás) csak a metódusok vagy tulajdonságok első meghívásakor történik meg.
A lusta betöltés csak a felhasználó által definiált osztályok esetében használható, a PHP belső osztályai esetében nem. Ehhez a PHP 8.4 vagy újabb verziószámú PHP szükséges.
Címkék
A címkék a szolgáltatások kiegészítő információkkal való kiegészítésére szolgálnak. Egy vagy több címkét rendelhet egy szolgáltatáshoz:
A címkék értékeket is hordozhatnak:
A tagged()
funkcióval lekérdezheti az adott címkékkel rendelkező összes szolgáltatást:
A DI konténerben a findByTag()
metódus segítségével megkaphatja az összes, egy adott címkével rendelkező
szolgáltatás nevét:
Injektálás mód
A inject: true
jelző használata aktiválja a függőségek átadását nyilvános változókon keresztül az inject megjegyzésekkel és az inject*() metódusokkal.
Alapértelmezés szerint a inject
csak az előadók esetében van aktiválva.
Szolgáltatás módosítások
A DI konténer számos beépített vagy felhasználói bővítéssel hozzáadott szolgáltatást
tartalmaz. Ezeknek a szolgáltatásoknak a definícióit közvetlenül a konfigurációban módosíthatja. Például
megváltoztathatja a application.application
szolgáltatás osztályát, amely a hagyományos
Nette\Application\Application
, másra:
A alteration
jelző tájékoztató jellegű, jelzi, hogy csupán egy meglévő szolgáltatást módosítunk.
Kiegészíthetjük a beállítást is:
Itt jön jól a reset
:
Ha egy bővítmény által hozzáadott szolgáltatást szeretne eltávolítani, akkor ezt a következőképpen teheti meg: