Достигнут максимальный уровень вложенности функций Laravel ‘256’

#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. Большое вам спасибо, это был единственный момент, о котором я не подумал 🙂