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