#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 .
Комментарии:
1. @Nathan Действительно, см. Редактирование под моим ответом и эту ссылку, но да, в нижней строке закрытие функции создает свою собственную область видимости, которая не может видеть переменные вне нее, если они
global
не (не делайте этого) или не передаются черезuse
ключевое слово