danog/advanced-json-rpc

A more advanced JSONRPC implementation

Maintainers

👁 danog

Package info

github.com/danog/php-advanced-json-rpc

pkg:composer/danog/advanced-json-rpc

Statistics

Installs: 9 110 500

Dependents: 3

Suggesters: 0

Stars: 13

Open Issues: 4

v3.2.3 2026-01-12 21:07 UTC

Requires

Requires (Dev)

Suggests

None

Provides

None

Conflicts

None

Replaces

  • felixfbecker/php-advanced-json-rpc: ^3

ISC ae703ea7b4811797a10590b6078de05b3b33dd91

  • Felix Becker <felix.b.woop@outlook.com>
  • Daniil Gentili <daniil.woop@daniil.it>

README

👁 Version
👁 Coverage
👁 semantic-release
👁 License

Provides basic classes for requests and responses in JSONRPC and a Dispatcher class that can decode a JSONRPC request and call appropriate methods on a target, coercing types of parameters by type-hints and @param tags.

Supports nested targets: If the method is something like myNestedTarget->theMethod, the dispatcher will look for a myNestedTarget property on the target and call theMethod on it. The delimiter is configurable and defaults to the PHP object operator ->.

Example

use AdvancedJsonRpc\Dispatcher;

class Argument 
{
 public $aProperty;
}

class Target
{
 public function someMethod(Argument $arg)
 {
 // $arg instanceof Argument === true
 // $arg->aProperty === 123
 return 'Hello World';
 }
}

$dispatcher = new Dispatcher(new Target());

$result = $dispatcher->dispatch('
 {
 "jsonrpc": "2.0",
 "id": 1,
 "method": "someMethod", 
 "params": {
 "arg": {"aProperty": 123}
 }
 }
');

// $result === "Hello World"

Nested Targets

use AdvancedJsonRpc\Dispatcher;

class TextDocumentManager 
{
 public function didOpen(string $uri)
 {
 return 'Thank you for this information';
 }
}

class LanguageServer
{
 public $textDocument;

 public function __construct()
 {
 $this->textDocument = new TextDocumentManager();
 }
}

$dispatcher = new Dispatcher(new LanguageServer(), '/');

$result = $dispatcher->dispatch('
 {
 "jsonrpc": "2.0",
 "id": 1,
 "method": "textDocument/didOpen", 
 "params": {
 "uri": "file:///c/Users/felix/test.php"
 }
 }
');

// $result === "Thank you for this information"