# ServiceManager A phlex keretrendszerbe egy laza szervízmenedzser lett megvalósítva. Ez - többek között - [Env](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. ```php 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: ```php 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 ```php 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. ```php class YourClass implements InjectDependencies{ ... } ```