Kontekst¶
Czym jest kontekst?¶
Kontekst jest zbiorem wartości i ustawień dla systemu. Możemy w nim przekazywać usługi pomiędzy klasami za pomocą klasy typu Provider, bądź ustawić globalne zmienne.
Inicjalizacja kontekstu¶
Kontekst tworzymy za pomocą instancji klasy implementującej interfejs ClientContext. W kliencie gotowa jest klasa o nazwie BasicClientContext, która implementuje wyżej wymieniony interfejs.
<?php
BasicClientContext::newInstance()
->setProperty('mysqlHost', 'localhost');
?>
Tak utworzony kontekst możemy przekazywać pomiędzy klasami, dzięki temu w każdej z klas będziemy mieli dostęp do danych MySQL.
Jak przekazać serwis do klasy?¶
Aby przekazać serwis, który odpowiada za różne działania żądane w stworzonej klasie, należy w niej czytać kontekst. Przykładowo tworzymy właściwość przechowującą klasy implementujące ClientContext oraz za pomocą DependencyInjection wstrzykujemy kontekst do klasy.
<?php
class TestClass {
/**
* @var ClientContext
*/
private $context;
public function __construct(ClientContext $c) {
$this->context = $c;
}
}
?>
Tak przekazany kontekst możemy teraz odczytać za pomocą odwołania się do właściwości $context. Przypuśćmy na ten moment, że posiadamy usługę, która posiada możliwość dostępu do wszystkich obiektów w bazie danych oraz zarządzania nimi. Niech będzie to klasa DatabaseManagerService. Klase tą razem z jej zapisanymi właściwościami możemy przekazać do drugiej klasy za pomocą kontekstu, przypisując do niego serwis metodą addService().
<?php
class AppContextProvider implements ContextProvider {
public function register(ClientContext $c) {
$c->addService(DatabaseManagerService::ENTRY, new DatabaseManagerService('localhost', 'root', 'testpasswd', 'db'));
}
}
?>
W taki sposób dodaliśmy do kontekstu serwis, aby go pobrać możemy użyć metody getProperty().
<?php
class TestClass {
/**
* @var ClientContext
*/
private $context;
public function __construct(ClientContext $c) {
$this->context = $c;
}
private function updateProfile($profile) {
/** @var DatabaseManagerService $manager */
$manager = $this->context->getProperty(DatabaseManagerService::ENTRY);
$manager
->getProfile($profile->getKey())
->setData($profile)
->update();
}
}
?>