Метод php не определен в сгенерированном протобуфом классе
Я пишу клиентское приложение для подключения к песочнице DA. Следующий код:
$grpc_channel = Grpc\ChannelCredentials::createInsecure();
$client = new Com\Digitalasset\Ledger\Api\V1\LedgerIdentityServiceClient('localhost:7600', [
'credentials' => $grpc_channel,
]);
$request = new Com\Digitalasset\Ledger\Api\V1\GetLedgerIdentityRequest();
$ledger_id_response = $client->GetLedgerIdentity($request);
$ledger_id = $ledger_id_response->getLedgerId();
вызывает следующую ошибку:
PHP Fatal error: Uncaught Error: Call to undefined method Grpc\UnaryCall::getLedgerId() in /.../damlprojects/loaner_car/php/ledger_client.php:31
Однако это должно быть определено, поскольку $ledger_id_response имеет тип GetLedgerIdentityResponse, у которого есть метод:
public function getLedgerId()
{
return $this->ledger_id;
}
Что является причиной ошибки?
2 ответа
Это унарный звонок? Вы еще не получили ответ. Пока что $ledger_id_response является нулевым.
$call = $client->GetLedgerIdentity($request);
list($ledger_id_response, $status) = $call->wait();
if ($status->code == \Grpc\STATUS_OK) {
$ledger_id = $ledger_id_response->getLedgerId();
}
После тщательного изучения "кода клиента" в примере " Hello World" на веб-сайте grpc
$request = new Helloworld\HelloRequest();
$request->setName($name);
list($reply, $status) = $client->SayHello($request)->wait();
Я осознал свои ошибки.
1. При оформлении запроса на услугу. Это должно быть сделано путем вызова wait() возвращаемого объекта. Следовательно
$client->GetLedgerIdentity($request);
должен быть изменен на
$client->GetLedgerIdentity($request)->wait();
2. Возвращаемое значение приходит в виде массива. Следовательно
$ledger_id_response = must be changed to
list($ledger_id_response, $status) =
как это
list($ledger_id_response, $status) = $client->GetLedgerIdentity($request)->wait();
Теперь можно вызвать getLedgerId
$ledger_id = $ledger_id_response->getLedgerId();
без ошибок!