Laravel的最大功能嵌套级别达到“ 256”

时间:2019-04-17 14:14:56

标签: json laravel api

我正在调用一个API,该API提供了JSON,STDClass和数组的嵌套混合物。我主要关心的问题之一是试图从中取出已解决的特定数据。关键是代码在我尝试使用Laravel刀片之前一直有效。创建了一个称为master.layout.php的布局,并创建了一个名为“内容”的部分,该部分将标签中的代码用作代码之后,它停止工作,并不断显示“达到最大函数嵌套级别“ 256””错误。

我尝试了Stackoverflow中的一些解决方案,甚至通过更改PHP.ini文件中的xdebug配置来绕过它的一些技巧。但不幸的是,他们都没有为我工作。一位成员说:“最好是看一下代码的结构,而不要尝试绕过它,所以我这样做了。从我的发现中,我觉得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 :(得分:0)

您实际上不应该在刀片模板中实例化控制器。

问题在于,您实际上是在引起无限循环。

在控制器内,您正在加载刀片视图。然后,在刀片视图中,您将创建控制器的新实例并再次运行该方法。然后,该方法返回相同的视图,因此该过程再次开始。然后,这将不断进行下去,直到PHP最终达到极限-这就是这里的问题。

相反,您应该有一个返回视图的控制器。然后,您可以实例化一个单独的类,该类仅以字符串形式返回您要获取的值。这样,您就不会重新加载控制器并陷入无限循环。