Вот решил написать что-то.
И это что-то оказалось реализацией 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%, так что всё должно быть в порядке и можно юзать уже сейчас. Но я не стал бы рисковать и подождал первого релиза, дабы потом не пришлось всё переделывать, если мне вдруг приспичит что-то переделать так, что оно не будет иметь обратную совместимость с текущей версией.