Services - laborci/andesite GitHub Wiki
Services
Szervizek regisztrálása
A szervizeket a ServiceContainer statikus metódusain keresztül tudod regisztrálni.
bind / shared
public static function bind($name, $service): ServiceFactory
public static function shared($name, $service): ServiceFactory
A $service argument lehet string, azaz egy osztály neve, ami implementálja a szervízt, vagy egy callable, ami elvégzi a példányosítást. A bind minden egyes alkalommal új példányt ad, a shared viszont egyszer legyárt egy szerviz példányt és onnantól kezdve azt adja vissza mindig.
value
public static function value($name, $value): ServiceFactory
Ez egy értéket (tipikusan objektumpéldányt) rögzít egy szervíz néven.
Szervizek elérése
Konstruktoron keresztül
Amennyiben szervízekkel dolgozol, akkor a szervizek másik szervizeket többnyire a konstruktorukon keresztül kapnak. Szervizeket mindig a ServiceContainer-en keresztül kapsz, ami gondoskodik a példányosításról és így a függőségekről is.
get
public static function get($name)
A ServiceContainer statikus get metódusát hívva kérhetsz tőle szervizeket, amiket természetesen a gondoskodik a függőségek példányosításáról is.
Autoservice
Bármilyen szervízként értelmezhető, azaz automatikusan példányosítható (tehát konstruktorában szervízt, vagy szervízként értelmezhető osztály példányt váró) osztály elkérhető a ServiceContainer-től, akkor is, ha az nem volt előre regisztrálva. Ekkor megteszi automatikusan a regisztrációt. Ha az osztály implementálja a Andesite\Core\ServiceManager\SharedService interface-t, akkor shared módon.
Mágikus Service()
Kódban a szervizek példányosítása kényelmes a konstruktoron keresztül. De ez nem mindig kivitelezhető, ekkor használjuk a ServiceContainer::get metódusát. Ez viszonylag kényelmetlen, hiszen az IDE a szerviz nevéből még nem tudja, hogy ott milyen osztály példányát kaptunk vissza, azaz a programozást ki kell egészíteni annotációkkal.
/** @var \Andesite\Core\Env\Env $env */
$env = ServiceContainer::get(Env::class);
Erre nyújt sok esetben megoldást a Service trait, ami egy nagyon egyszerű Service statikus metódussal egészíti ki az osztályt.
public static function Service(): self
Ezen a módon ugyanúgy függőségeivel együtt tudod elkérni a szervízt - függetlenül attól, hogy azt korábban regisztráltad e, vagy sem - és megkapod annak példányát, viszont oly módon, hogy az IDE is pontosan tudja, hogy milyen osztályt kértél/kaptál.
Env::Service()->get('sys.domain');