Присвоить значение объекту из Guzzle on_stats

#php #laravel #guzzle

#php #laravel #guzzle

Вопрос:

глупый и краткий вопрос здесь,

Я уже некоторое время пытаюсь заставить конечные точки работать на моем веб-сайте, когда действие вызывает вызов конечной точки. Я хотел бы собирать статистику по успешному вызову и среднему времени отклика и тому подобному, поэтому я создаю модель перед отправкой запроса, а затем пытаюсь присвоить значения объекта после достижения этапа запроса on_stats. Проблема в том, что когда я пытаюсь назначить переменные изнутри запроса, он не может получить доступ к объекту, выдавая Creating default object from empty value ошибку. У Guzzle есть способы сделать вещи синхронными, используя обещания, но я пытался и не смог их реализовать после множества ошибок и попыток отладки. Нет ли способа заставить работать то, что я пытаюсь сделать в приведенном ниже коде? Как я могу получить доступ к объекту и назначить значения из самого запроса?

 $call = new EndpointCall;
$call->endpoint_rel_id = $endpt->id;
                            
// Initiate GuzzleHTTP Client
$client = new Client();
$requestQuery = $endpt->endpoint_url;
                            
$response = $client->request('POST', $requestQuery, [
     'allow_redirects' => false,
     'json' => $obj,
     'headers' => [
           'api-secret' => $user->api_sending_secret,
           'Accept'     => 'application/json',
     ],
     'synchronous' => true,
     'http_errors' => false,
     'on_stats' => function (TransferStats $stats) {
            $call->response_time = $stats->getTransferTime();
            if ($stats->hasResponse()) {
                $call->response = $stats->getResponse()->getStatusCode();
            }
            $call->save();
     }
]);
  

Ответ №1:

Попробуйте добавить use($call) в объявление функции следующее:

 $call = new EndpointCall;
$call->endpoint_rel_id = $endpt->id;
                            
// Initiate GuzzleHTTP Client
$client = new Client();
$requestQuery = $endpt->endpoint_url;
                            
$response = $client->request('POST', $requestQuery, [
     'allow_redirects' => false,
     'json' => $obj,
     'headers' => [
           'api-secret' => $user->api_sending_secret,
           'Accept'     => 'application/json',
     ],
     'synchronous' => true,
     'http_errors' => false,
     'on_stats' => function (TransferStats $stats) use($call) {
            $call->response_time = $stats->getTransferTime();
            if ($stats->hasResponse()) {
                $call->response = $stats->getResponse()->getStatusCode();
            }
            $call->save();
     }
]);
  

О ключевом слове use

Переменные недоступны внутри функций, если они не объявлены как глобальные. Во многом таким же образом переменные из дочерней области недоступны из замыкания, если явно не указано с помощью ключевого слова use .

Комментарии:

1. @Nathan Действительно, см. Редактирование под моим ответом и эту ссылку, но да, в нижней строке закрытие функции создает свою собственную область видимости, которая не может видеть переменные вне нее, если они global не (не делайте этого) или не передаются через use ключевое слово