Просмотр поста

.
reaper

Давно я здесь ни с кем ничем не делился.
Вот решил написать что-то.
И это что-то оказалось реализацией JSON-RPC протокола.
Правда только серверной части.

https://github.com/Kilte/json-rpc

Юзается это так:

use Acme\UserApplication;
use Kilte\JsonRpc\Application;
use Kilte\JsonRpc\Server;
use Kilte\JsonRpc\Request\IOStreamFactory;
use Kilte\JsonRpc\Response\ResponseFactory;

$app = new Application(new UserApplication());

$responseFactory = new ResponseFactory();
$responseFactory->add('http', '\\Kilte\\JsonRpc\\Response\\HttpResponse');

$server = new Server($app, new IOStreamFactory(), $responseFactory, 'http');
$server->handle();


Первым делом создаём экземпляр приложения.
Для этого воспользуемся объектом класса pplication, который выступает в качестве обертки для пользовательских методов.
Туда можно запихнуть как и экземпляр класс, так и массив с анонимными функциями.

Затем создаем экземпляр класса ResponseFactory для того, чтобы определить, каким образом сервер будет отвечать клиенту.
В данном случает он будет отвечать по http.

Ну и наконец создаем объект сервера, в который первым аргументом инжектится приложение, вторым фабрика для получения запросов, третьим наш респонсфактори и четвертым тип ответа который будет использоваться.

IOStreamFactory отвечает за создание объекта запроса. Данные берет из php://input.
Можно определить свою фабрику унаследовавшись от AbstractFactory.

Также, как вы уже наверное догадались, вместо http-ответа можно тоже определить что-либо своё для того, чтобы заюзать, zeromq или WebSockets к примеру, а может вы юзаете какой-то фреймворк, в котором не принято обращаться к глобальным переменным и есть свои методы/объекты доступа к ним (Symfony к примеру).
Для того, чтобы указать откуда брать тело запроса нужно реализовать ResponseInterface и закинуть его в фабрику. А еще указать серваку, что нужно юзать именно его. (Последний аргумент у Server в примере).

Осталось реализовать обработку batch вызовов и еще раз всё перепроверить.
Ну и заодно доку запилить.

Либа протестирована на 99%, так что всё должно быть в порядке и можно юзать уже сейчас. Но я не стал бы рисковать и подождал первого релиза, дабы потом не пришлось всё переделывать, если мне вдруг приспичит что-то переделать так, что оно не будет иметь обратную совместимость с текущей версией.