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