Метод php не определен в сгенерированном протобуфом классе - PullRequest
0 голосов
/ 01 марта 2019

Я пишу клиентское приложение для подключения к песочнице 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 ]

0 голосов
/ 01 марта 2019

После тщательного изучения «кода клиента» в примере «Привет, мир» на сайте 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();

без ошибок!

0 голосов
/ 01 марта 2019

Это унарный звонок?Вы еще не получили ответ.Пока что $ 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();
}
...