【问题标题】:Undefined property: GuzzleHttp\Psr7\Response::$Results - Laravel 5.2 using API未定义的属性:GuzzleHttp\Psr7\Response::$Results - Laravel 5.2 使用 API
【发布时间】:2016-05-16 00:29:34
【问题描述】:

我正在尝试在我的 Laravel 5 API 中实现缓存,但我遇到了麻烦。我现在收到此错误:

MedalController.php 第 19 行中的 ErrorException:
未定义属性:GuzzleHttp\Psr7\Response::$Results

谁能弄清楚为什么这没有得到我的标题? 我以前从未真正使用过缓存,所以我可能在这里遗漏了一些东西

这就是我在 Halo 5 游戏中调用并计算每个玩家的奖牌数的方式:

获取数据控制器:

class GetDataController extends Controller {


    /**
     * Fetch a Players Arena Stats
     *
     * @param $gamertag
     * @return mixed
     */
    public function getPlayerArenaStats($gamertag) {

        $client = new GuzzleHttp\Client();

        $baseURL = 'https://www.haloapi.com/stats/h5/servicerecords/arena?players=' . $gamertag;

        $res = $client->request('GET', $baseURL, [
            'headers' => [
                'Ocp-Apim-Subscription-Key' => env('Ocp-Apim-Subscription-Key')
            ]
        ]);

        Cache::put('stats', $res, 10);

        if ($res->getStatusCode() == 200) {
            return $result = json_decode($res->getBody());
        } elseif ($res->getStatusCode() == 404) {
            return $result = redirect()->route('/');
        }

        return $res;
    }

}

我的 MedalControler 调用标题并尝试为玩家获取所有奖牌:

class MedalController extends Controller {

    /**
     * Get a Players Arena Medals
     *
     * @param $playerArenaMedalStats
     * @return mixed
     */
    public function getArenaMedals($playerArenaMedalStats) {


        $results = collect($playerArenaMedalStats->Results[0]->Result->ArenaStats->MedalAwards);

        $array = $results->sortByDesc('Count')->map(function ($item, $key) {
            return [
                'MedalId' => $item->MedalId,
                'Count' => $item->Count,
            ];
        });

        return $array;
    }


}

这就是获取、解码和返回奖牌以供查看的方式:

class StatsController extends Controller {


    /**
     * Return all Stats for a particular player
     * 
     * @param Request $request
     * @return mixed
     */
    public function index(Request $request) {

        if (Cache::has('stats')) {
            $playerArenaMedalStats = Cache::get('stats');
            $playerArenaMedalStatsArray = app('App\Http\Controllers\MedalController')->getArenaMedals($playerArenaMedalStats);
            $arenaMedals = json_decode($playerArenaMedalStatsArray, true);
        } else {
            app('App\Http\Controllers\GetData\GetDataController')->getPlayerArenaStats($gamertag);
        }

      // More stuff here, shortened for simplicicty

      return view('player.stats')->with('arenaMedals', $arenaMedals);

    }


}

【问题讨论】:

    标签: php laravel caching laravel-5.2


    【解决方案1】:

    return $res 在您的 getPlayerArenaStats 方法的末尾。它返回GuzzleHttp\Psr7\Response,您正试图在MedalController 上的getArenaMedals 方法中获取$playerArenaMedalStats->Results[0]

    【讨论】:

    • 如果你说要删除 return $res,那么我做到了,但它仍然给我同样的错误
    • 抱歉,这不是问题所在,在“GetDataController”上的“getPlayerArenaStats”方法中,您使用“Cache::put('stats', $res, 10 将 GuzzleHttp\Psr7\Response 放入缓存中);",然后在 StatsController" 中将其传递给变量 "$playerArenaMedalStats = Cache::get('stats');"。然后将其传递给 "getArenaMedals" 方法。在 getArenaMedals 中,您调用 "$playerArenaMedalStats->Results [0]"。这就是问题所在。所以您必须将 Json decode $res Cache 放入 GetData 控制器中。Cache::put('stats', json_decode($res->getBody()), 10); "return $res" 如果您收到类似 500 的响应代码,也会引发错误
    • 是的,这行得通。现在我的数据缓存没有错误!
    • 我只是想问一下缓存是如何工作的。那么这是否意味着每次我加载用户配置文件时,它不会在 10 分钟内更新“奖牌”,直到缓存结束?
    • 我对@9​​87654328@ 没有太多经验,但我认为这就是想法
    【解决方案2】:

    正如 Ravisha Hesh 所说,我只需将我的 getPlayerArenaStats 中的缓存更改为:

     Cache::put('stats', json_decode($res->getBody()), 10);
    

    我必须先对其进行 json_decode

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      相关资源
      最近更新 更多