Skip to content
This repository was archived by the owner on Jul 8, 2020. It is now read-only.

ServiceManager

Laborci Gergely edited this page Aug 10, 2017 · 3 revisions

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.

Bind

ServiceManager::bind(string $service...$for): ServiceFactory

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.

ServiceFactory

A ServiceManager::bind metódusa mindig egy ServiceFactory objektummal tér vissza, ami az alábbi metódusokkal rendelkezik:

value($value)

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.

service($service, ...$arguments)

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.

sharedService($service, ...$arguments)

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'));

ServiceFactory - factory method

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.

Get

ServiceManager::get(string $serviceName)

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.

Service Autoregister

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:

SharedService Interface

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.

InjectDependencies Interface

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{ ... }

Clone this wiki locally