#json #laravel #api
#json #laravel #API
Вопрос:
Я вызываю API, который предоставляет вложенную смесь JSON, stdClass и массивов. Одной из моих главных проблем была попытка извлечь из нее конкретные данные, которые были решены. Дело в том, что код работал до тех пор, пока я не попытался использовать Laravel blade. После создания макет называется master.layout.php , и создав раздел под названием «содержимое», который принимает коды внутри тега, он перестал работать и продолжал выдавать мне ошибку «Достигнут максимальный уровень вложенности функций ‘256’».
В Stackoverflow были некоторые решения, которые я пробовал, и некоторые приемы, чтобы даже обойти его, изменив конфигурацию xdebug в файле PHP.ini. но, к сожалению, ни один из них не сработал для меня. Один из участников сказал: «Лучше взглянуть на структуру вашего кода, а не пытаться обойти его, что я и сделал. Из того, что я понял, я чувствую, что функция json_decode () продолжает повторяться, поскольку это рекурсивная функция. Я попытался установить для него глубину, но это тоже не сработало. Я был бы рад, если бы кто-нибудь подсказал мне, как исправить эту проблему. Вот код:
price.blade.php:
@extends('layouts.master')
@section('content')
@php
$btc = new AppHttpControllersCoinsController();
$parameters = [
'start' => '1',
'limit' => '1',
];
$query = http_build_query($parameters);
$result = $btc->apiGet('https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest'."?".$query);
$price = json_decode($result['response'])->data[0]->quote->USD->price;
@endphp
<h1>Bitcoin Price Live</h1>
<h2>{{"Current Price of Bitcoin: ". $price}}</h2>
@stop
CoinsController.php:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class CoinsController extends Controller
{
function apiGet($url)
{
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_TIMEOUT => 30000,
CURLOPT_POST => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
// Set Here Your Requesred Headers
'Content-Type: application/json',
'Accept-Encoding: deflate, gzip',
'X-CMC_PRO_API_KEY: xxxxxxxxxxxxxxxxxxx',
),
)
);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
json_decode($response);
}
return view('index.price', compact('response'));
}
}
Комментарии:
1. изменить
@stop
на@endsection
2. @J. Doe Я попробую через несколько минут, но могу я спросить, в чем разница между ними?
Ответ №1:
На самом деле вы не должны создавать экземпляр контроллера в шаблоне блейда.
Проблема в том, что вы, по сути, вызываете бесконечный цикл.
В вашем контроллере вы загружаете свой блейд-вид. Затем в вашем представлении блейда вы создаете новый экземпляр контроллера и снова запускаете метод. Затем этот метод возвращает тот же вид, и процесс запускается снова. Затем это будет продолжаться и продолжаться, пока PHP в конечном итоге не достигнет предела — и в этом проблема.
Вместо этого у вас должен быть один контроллер, который возвращает представление. Затем у вас может быть отдельный класс, который вы создаете, который просто возвращает вам значение, которое вам нужно, в виде строки. Таким образом, вы не перезагружаете контроллер и не попадаете в бесконечный цикл.
Комментарии:
1. Большое вам спасибо, это был единственный момент, о котором я не подумал 🙂