【问题标题】:Laravel ErrorException(code: 0): Object of class stdClass could not be converted to stringLaravel ErrorException(代码:0):stdClass类的对象无法转换为字符串
【发布时间】:2020-08-31 00:33:14
【问题描述】:

我在我的 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-&gt;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": "5_test@test.co",
      "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】:

    我相信您的错误在于以下代码行:

    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);
    }
    

    希望这会有所帮助。

    【讨论】:

    • 当然我可以看到数据,但我仍然无法访问我想要实现的属性。因此,如果我像这样设置变量$dedicatedAccount = json_encode(json_decode($response-&gt;getBody()));,我将能够记录$dedicatedAccount,但无法记录$dedicatedAccount-&gt;data-&gt;account_number。它会抛出错误Trying to get property 'data' of non-object,这意味着它仍然不知道返回的对象。
    • 如果你在上面查看我的答案,我记录的是json_encode($dedicatedAccount),但我的记录是$dedicatedAccount = json_decode($response-&gt;getBody())。所以我正在记录一个字符串,但我的$dedicatedAccount 仍然是一个对象,因为它已经被解码。从您在问题中发布的代码中,我唯一做的就是将 Log::info('dedicatedAccount: ' . $dedicatedAccount); 更改为 Log::info('dedicatedAccount: ' . json_encode($dedicatedAccount));
    • 我明白了。那么,如果我想返回$dedicatedAccount 并通过执行$dedicatedAccount-&gt;data-&gt;account_number 之类的操作来访问属性,我该怎么做呢?我记录它的原因是首先检查我是否真的得到了对象。
    • 首先,删除Log:info 语句。然后,如果您只想要对象的特定属性,只需将其原样返回return $dedicatedAccount-&gt;data-&gt;account_number。否则,返回整个对象,如return $dedicatedAccount。那么如果你的$response-&gt;getStatusCode()不是200,你可以根据喜好return false或者return null
    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多