-
Notifications
You must be signed in to change notification settings - Fork 0
ServiceManager
A phlex keretrendszerbe egy laza szervízmenedzser lett megvalósítva. Ez - többek között - Env-el együtt képezi a rendszer egyik sarokpontját.
A ServiceManager megvalósítás a lusta programozó szervíz kiszolgálója.
A fenti metóduson keresztül tudod hozzáfűzni a szervízeidet a menedzserhez. Két argumentummal rendelkezik, ebből az első a szervíz neve, ami lehet jobb esetben egy Interface neve, vagy akár egy teljesen ad-hoc megadott név. A második argumentum viszont ritkábban használt érték - értékek. Ezen keresztül tudod megmondani, hogy az adott nevű szervízt mely hívó osztályoknak szeretnéd kiszolgálni. Erre példa az Env.php-ben látszódik jól.
ServiceManager::bind(LoggerInterface::class)->sharedService(Log::class);
ServiceManager::bind(LoggerInterface::class, Access::class)->sharedService(SqlLog::class);Az első sorban regisztrálsz egy szervízt a LoggerInterface-re, bárki aki megszólítja egy Log példányt fog kapni. Viszont a második sorban specializálod a szervízt olyan formán, hogyha a hívó fél az Access példánya, akkor számára egy SqlLog objektumot fog kapni Log helyett.
A ServiceManager::bind metódusa mindig egy ServiceFactory objektummal tér vissza, ami az alábbi metódusokkal rendelkezik:
A legritkábban használt, mégis értékes funkció. A szervízmenedzserbe egy értéket, egy objektumot adhatsz meg, illetve kérheted tőle azt vissza.
Azaz rögzítesz egy $service nevű osztályt, aminek a példányát fogod megkapni a szervíz kérésekor. A további argumentumokat, amiket itt megadsz, a példányosításkor adja át a szervízmenedzser a szervízednek.
Szinte teljesen ugyan az, mint a fenti service metódus, azzal a különbséggel, hogy akár hányszor kéred el a szervízt, az mindig ugyan azt az egy példányt fogja visszaadni. Nagyon jó példa erre az adatbázis kapcsolat szervíz megadása, mely egy kapcsolati stringhez - amit argumentumként kap a ServiceFactory - mindig ugyan azt a kapcsolati objektumot fogja visszaadni:
ServiceManager::bind('database')->sharedService(Access::class, Env::get('database'));Amennyiben a fenti metódusok $service argumentuma nem string, hanem hívható (lambda függvény), akkor a példányosítást ez a függvény fogja elvégezni és a további argumentumok is ennek a függvénynek lesznek átadva.
Amennyiben explicit szeretnél kérni egy szervízt a szervízmenedzsertől, akkor azt annak get metódusán keresztül tudod elkérni tőle, megadva annak nevét.
A szervízmenedzser leírásának elején olvashattad a mondatot, hogy "A ServiceManager megvalósítás a lusta programozó szervíz kiszolgálója."
Ugyanis a fentebb leírtaknál többet is tud ez a modul. Amennyiben egy nem regisztrált szervízt kérsz a menedzsertől, és a megadott név egy létező osztály neve, akkor annak egy példányát fogja visszaadni. Hogy ezt a működést kicsit szabályozni tudd, két Interface-t hoztunk létre:
Amennyiben az osztályod megvalósítja a SharedService interface-t
class YourClass implements SharedService{ ... }és a ServiceManageren keresztül példányosítod, akkor a ServiceManager egy példányt fog visszaadni minden kéréskor.
Hasonlóan semmilyen implementációs igéne nincs, viszont fentinél is érdekesebb az InjectDependencies interface ami a példányosítás folyamatára van hatással. Ekkor ugyanis a rendszer megvizsgálja az osztályod konstruktorát és minden bemenő paramétert ugyanúgy a ServiceManager-en keresztül fog automatikusan példányosítani.
class YourClass implements InjectDependencies{ ... }