Как вернуть ответ от asyn c запроса GuzzleHttp к внешней функции или обработать исключение в yii2? - PullRequest
0 голосов
/ 19 февраля 2020

Мне нужно отправить асинхронный c пост-запрос в фоновом режиме и сохранить ответ (код состояния и тело запроса в БД). Я решил использовать пакет GuzzleHttp (v6) для него.

Идея состоит в том, чтобы запустить функцию sendAsyncRequest, отправить в нее асинхронный c запрос, затем получить ответ от ресурса в массиве с ключами code, data, вернуть этот массив внешней функции processAsyncRequest и затем отправить его в функцию logResponse, чтобы сохранить его в дБ.

use GuzzleHttp\Client as GuzzleClient;

class Logger 
{

public function processAsyncRequest($client)
{
    $response = $this->sendAsyncRequest($client->phone, ['utm_source' => $client->utm_source]);
    $this->logResponse($client, $response);
}

public function sendAsyncRequest($phone, $params)
{
    $url_params = http_build_query(['utm_source' => $client->utm_source]);

    $guzzleClient = new GuzzleClient();
    $headers = [
            'Content-Type' => 'application/json',
            'Authorization' => 'Basic xxxxxxxxxx',
        ];
    $request = new Request('POST', 'url' . $phone . '/tokens/?' . $url_params, $headers);

    $promise = $guzzleClient->sendAsync($request);

    $promise->then(
        function (ResponseInterface $response) {
            return [
                'code' => $response->getStatusCode(),
                'body' => $response->getBody()->__toString(),
            ];
        },
            function(RequestException $e) {
                return [
                    'code' => $e->getResponse()->getStatusCode(),
                    'body' => $e->getMessage(),
                ];
            }
        );
    $res = $promise->wait();
    return $res;
}

public function logResponse($client, $data)
{
    $log = new Log();
    $log->client_id = $client->id;
    $log->url = 'url';
    $log->response = $data['code'] . ', ' . $data['body'];
    $log->comment = 'reg';
    return $log->save();
}

}

Проблемы:

  1. функция sendAsyncRequest возвращает объект GuzzleHttp\Psr7\Response , Я вижу ошибку "Невозможно использовать объект типа GuzzleHttp \ Psr7 \ Response в качестве массива", и я не знаю, как получить из него массив $res.

  2. как правильно обработать исключение, если обещание вернет ошибку?

...