Достигнут максимальный уровень вложенности функции Laravel '256' - PullRequest
0 голосов
/ 17 апреля 2019

Я вызываю API, который дает вложенную смесь JSON, STDClass и Arrays.Одной из моих главных проблем была попытка извлечь из нее конкретные данные, которые были решены.Дело в том, что код работал, пока я не попытался использовать лезвие Laravel.После создания макета с именем master.layout.php и создания раздела под названием «content», который принимает коды внутри тега, он перестал работать и продолжал выдавать ошибку «Максимальный уровень вложенности функций« 256 »достигнут».

В Stackoverflow было несколько решений, которые я пробовал, и некоторые приемы, позволяющие обойти его, изменив конфигурацию xdebug в файле PHP.ini.но, к сожалению, никто из них не работал для меня.Один из членов сказал: «Лучше взглянуть на структуру вашего кода, чем пытаться обойти его, что я и сделал. Из того, что я понял, я чувствую, что функция json_decode () продолжает рекурсивно работать, поскольку она рекурсивная функция. Я пыталсяустановить глубину, но это не сработало. Я был бы рад, если бы кто-нибудь рассказал мне о способах решения этой проблемы. Вот код:

price.blade.php:

@extends('layouts.master')
@section('content')
    @php
        $btc = new \App\Http\Controllers\CoinsController();
        $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 App\Http\Controllers;

use Illuminate\Http\Request;

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 Ответ

0 голосов
/ 17 апреля 2019

Вы не должны создавать экземпляр контроллера в шаблоне блейда.

Проблема в том, что вы, по сути, вызываете бесконечный цикл.

В вашем контроллере вы загружаете представление блейда.Затем в своем блейд-представлении вы создаете новый экземпляр контроллера и снова запускаете метод.Затем этот метод возвращает то же представление, и поэтому процесс начинается снова.Затем это будет продолжаться и продолжаться до тех пор, пока PHP не достигнет предела - и в этом-то и заключается проблема.

Вместо этого у вас должен быть один контроллер, который возвращает представление.Затем вы можете создать отдельный класс, который вы создаете, который просто возвращает вам значение, которое вы ищете в виде строки.Таким образом, вы не перезагружаете контроллер и не попадаете в бесконечный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...