我正在调用一个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'));
}
}
答案 0 :(得分:0)
您实际上不应该在刀片模板中实例化控制器。
问题在于,您实际上是在引起无限循环。
在控制器内,您正在加载刀片视图。然后,在刀片视图中,您将创建控制器的新实例并再次运行该方法。然后,该方法返回相同的视图,因此该过程再次开始。然后,这将不断进行下去,直到PHP最终达到极限-这就是这里的问题。
相反,您应该有一个返回视图的控制器。然后,您可以实例化一个单独的类,该类仅以字符串形式返回您要获取的值。这样,您就不会重新加载控制器并陷入无限循环。