Laravel ErrorException(code: 0): stdClass类的对象不能被转换为字符串。

问题描述 投票:0回答:1

我在laravel 6.x版本的应用程序中使用Guzzle来调用一个外部端点。如果响应状态为200,我试图通过以下代码来访问响应的属性

<?php

namespace App\Http\Controllers\API;

use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log;

class AccountController extends Controller
{
    public function createdDedicatedAccount()
    {
        $client = new Client(['verify' => false]);

        $secretKey = 'some_secret_key';
        $url = 'target_url';
        $headers = [
            'Authorization' => 'Bearer ' . $secretKey,
            'content-type'  => 'application/json',
        ];

        Log::info('Requesting dedicated account assignment to customer: ' . 24101696);

        $response = $client->request('POST', $url, [
            'headers' => $headers,
            'json' => ['customer' => 24101696]
        ]);

        if ($response->getStatusCode() === 200) {
            Log::info('Dedicated account assigned.');

            $dedicatedAccount = json_decode($response->getBody());
            Log::info('dedicatedAccount: ' . $dedicatedAccount);
            Log::info('account_number: ' . $dedicatedAccount->data->account_number);
        }
    }

但是当我试图访问属性时,我得到了这个异常的错误信息

stdClass类的对象无法转换为字符串。

以下是记录的内容

[2020-05-14 13:01:17] local.INFO: Customer created successfully with id: 24101696  
[2020-05-14 13:01:17] local.INFO: Requesting dedicated account assignment to customer: 24101696  
[2020-05-14 13:01:18] local.INFO: Dedicated account assigned.  
[2020-05-14 13:01:18] local.ERROR: Object of class stdClass could not be converted to string

如果我不 json_decoderesponse->getBody(),我能够成功登录 dedicatedAccount 这样

[2020-05-14 13:47:35] local.INFO: Customer created successfully on with id: 24103237  
[2020-05-14 13:47:35] local.INFO: Requesting dedicated account assignment to customer: 24103237  
[2020-05-14 13:47:37] local.INFO: Dedicated account assigned.  
[2020-05-14 13:47:37] local.INFO: dedicated_account: {
  "status": true,
  "message": "Account successfully created",
  "data": {
    "bank": {
      "name": "Test Bank",
      "id": 25,
      "slug": "test-bank"
    },
    "account_name": "TEST TEST",
    "account_number": "9930892996",
    "assigned": true,
    "currency": "NGN",
    "metadata": null,
    "active": true,
    "id": 89505,
    "created_at": "2020-03-30T10:13:13.000Z",
    "updated_at": "2020-05-14T12:47:38.000Z",
    "assignment": {
      "integration": 103612,
      "assignee_id": 24103237,
      "assignee_type": "Customer",
      "expired": false,
      "account_type": "PAY-WITH-TRANSFER-RECURRING",
      "assigned_at": "2020-05-14T12:47:38.588Z",
      "expired_at": null
    },
    "customer": {
      "id": 24103237,
      "first_name": "Test",
      "last_name": "Test",
      "email": "[email protected]",
      "customer_code": "CUS_ofuz99njymux0g9",
      "phone": null,
      "metadata": null,
      "risk_action": "default"
    }
  }
}  
[2020-05-14 13:47:37] local.ERROR: Undefined property: GuzzleHttp\Psr7\Stream::$data

但最后还是会出现另一个异常错误信息。

我得到的响应的正确处理方式是什么,以便我可以访问对象的属性?

php json laravel guzzle laravel-6
1个回答
0
投票

我相信你的错误是在以下几行代码中。

if ($response->getStatusCode() === 200) {
    Log::info('Dedicated account assigned.');

    $dedicatedAccount = json_decode($response->getBody());
    Log::info('dedicatedAccount: ' . $dedicatedAccount);
    Log::info('account_number: ' . $dedicatedAccount->data->account_number);
}

为了快速修复,请删除这行 Log::info('dedicatedAccount: ' . $dedicatedAccount); 并尝试运行你的代码。让我解释一下。一旦你解码了你的响应体,它就会变成一个带有从API发送的属性的对象。这个对象不能被记录,因为Log::info函数期望的是一个字符串而不是一个对象。如果你真的想看到这个对象,那么就把它作为一个json编码的字符串来记录,从而把上面的代码改为。

if ($response->getStatusCode() === 200) {
    Log::info('Dedicated account assigned.');

    $dedicatedAccount = json_decode($response->getBody());
    Log::info('dedicatedAccount: ' . json_encode($dedicatedAccount));
    Log::info('account_number: ' . $dedicatedAccount->data->account_number);
}

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.