Voraussetzungen:
Ich gehe bei der Dokumentation davon aus, dass Zend Framework 2 kein Fremdwort ist und das Erstellen von Modulen, Anlegen einer Modulkonfiguration und Einbinden der Klassen mit einem Autoloader kein Problem darstellen.
Erstellung und Einbindung einer API Klasse
API Klassen sind PHP Klassen deren öffentliche Methoden vom Client aufgerufen werden können. Für Parameter die vom Client an den Server übergeben werden sollen wird die Parameterliste der Methoden verwendet. Die Rückgabe der Methode wird Json formatiert an den Client zurückgesendet.
Beispiel einer API Klasse “Calculator” in einem Modul “Calculator” :
namespace Calculator\Api; class Calculator { public function addition($a, $b) { return $a + $b; } } |
Zum Einbinden der API Klasse muss ein Namensraum gewählt werden unter dem die Methoden dem Client zur Verfügung stehen.
Beispiel der Erweiterung der “/config/module.config.php”:
return [ 'dragonjsonserver' => [ 'apiclasses' => [ '\Calculator\Api\Calculator' => 'Calculator', ], ], ]; |
Der Client kann somit unter Angabe des Namensraums, des Methodennamens und der Parameter diese Methode ausführen und erhält das Ergebnis zurück.
Beispiel eines Requests vom Client für diese Abfrage:
{"id":1,"method":"Calculator.addition","params":{"a":1,"b":2}} |
Response:
{"result":3,"id":"1","jsonrpc":"2.0"} |
Der “ServiceManagerTrait”
Da die API Klassen nicht wie die Controller des Zend Frameworks über Zugriffsmethoden für den ServiceManager verfügen gibt es einen “ServiceManagerTrait” der diese Methoden in jeder Klasse wird zur Verfügung stellt.
Beispiel für die Verwendung des “ServiceManagerTrait”:
namespace Test\Api; class Test { use \DragonJsonServer\ServiceManagerTrait; public function test() { $serviceManager = $this->getServiceManager(); } } |
Events und der “EventManagerTrait”
Das Zend Framework 2 bietet die Möglichkeit Eventklassen zu erstellen, Events auszulösen und auf diese zu reagieren. Einzige Besonderheit im DragonJsonServer 2.x ist der “EventManagerTrait” der in allen Klassen verwendet werden kann um Zugriff auf den EventManager zu bekommen.
Beispiel für die Verwendung des “EventManagerTrait”:
namespace Test\Api; class Test { use \DragonJsonServer\ServiceManagerTrait; use \DragonJsonServer\EventManagerTrait; public function test() { $eventManager = $this->getEventManager(); } } |
Senden von Clientmessages
Zum Senden von Clientmessages an den Client steht das gleichnamige Event zur Verfügung. Das Event beinhaltet den Zeitraum von welchem der Client alle Clientmessages abfragt und über die “addClientmessage()” des Services können die jeweiligen Clientmessages der Response hinzugefügt werden.
Beispiel zum Senden einer Clientmessage in der Modulklasse in einem Modul “Test”:
namespace Test; class Module { use \DragonJsonServer\ServiceManagerTrait; public function init(\Zend\ModuleManager\ModuleManager $moduleManager) { $sharedManager = $moduleManager->getEventManager()->getSharedManager(); $sharedManager->attach( 'DragonJsonServer\Service\Clientmessages', 'Clientmessages', function (\DragonJsonServer\Event\Clientmessages $eventClientmessages) { $key = 'test'; $keys = $eventClientmessages->getKeys(); if (is_array($keys) && !in_array($key, $keys)) { return; } $data = [ 'from' => $eventClientmessages->getFromTimestamp(), 'to' => $eventClientmessages->getToTimestamp(), ]; $this->getServiceManager()->get('\DragonJsonServer\Service\Clientmessages') ->addClientmessage($key, $data); } ); } } |
Am meisten Sinn macht die Verwendung der Clientmessages wenn Requests anderer Clients Clientmessages für einen Empfänger in die Datenbank eintragen und der Empfänger diese bei seinem nächsten Request ausgeliefert bekommt.