在開發一個需要處理復雜 json-rpc 請求的項目時,我遇到了一個棘手的問題:如何高效地處理參數類型轉換和嵌套目標調用。傳統的 json-rpc 庫在這方面表現得不夠理想,導致開發效率低下,代碼復雜度增加。為了解決這個問題,我找到了 danog/advanced-json-rpc 這個庫,它為我提供了完美的解決方案。
danog/advanced-json-rpc 是一個高級的 JSON-RPC 實現庫,它提供了基本的請求和響應類,以及一個 Dispatcher 類。這個類可以解碼 JSON-RPC 請求,并根據方法名調用目標對象上的相應方法。更重要的是,它支持通過類型提示和 @param 標簽自動轉換參數類型,這大大簡化了參數處理的復雜度。
此外,danog/advanced-json-rpc 還支持嵌套目標調用。如果方法名類似于 myNestedTarget->theMethod,調度器會查找目標對象上的 myNestedTarget 屬性,并在其上調用 theMethod 方法。分隔符是可配置的,默認使用 php 對象操作符 ->。
使用 composer 安裝這個庫非常簡單:
composer require danog/advanced-json-rpc
以下是一個簡單的例子,展示如何使用 Dispatcher 類處理 JSON-RPC 請求:
use AdvancedJsonRpcDispatcher; 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"
另一個例子展示了如何處理嵌套目標:
use AdvancedJsonRpcDispatcher; 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"
使用 danog/advanced-json-rpc 庫后,我發現處理 JSON-RPC 請求變得更加高效和簡單。它的自動類型轉換和嵌套目標調用功能極大地簡化了代碼,提高了開發效率。如果你也面臨類似的 JSON-RPC 處理問題,不妨嘗試一下這個庫。