Trying to get property 'goods_name' of non-object

我是论坛里看到 翻译:利用 Laravel Resources 来整合第三方 API 数据 ,感觉用 API 接口整合在 Resources 里。下面代码

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class JinbaoGoodsResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     */
    public function toArray($request)
    {
        $goods_details = $this->resource['goods_detail_response']['goods_details']['0'];

        return [
            'mall_name'         => $goods_details['mall_name'],
            'goods_name'        => $goods_details['goods_name'],
            'goods_thumb'       => $goods_details['goods_image_url'],
            'group_price'       => $goods_details['min_group_price'],
            'normal_price'      => $goods_details['min_normal_price'],
            'coupon_discount'   => $goods_details['coupon_discount'],
            'coupon_quantity'   => $goods_details['coupon_remain_quantity'],
            'promotion_rate'    => $goods_details['promotion_rate'],
            'sales_quantity'    => $goods_details['sales_tip'],
            。。。省去其他
        ];
    }
}
<?php

namespace App\Http\Controllers;

use Justmd5\PinDuoDuo\PinDuoDuo;
use App\Http\Requests\JinbaoRequest;
use App\Http\Resources\JinbaoGoodsResource;

class JinbaoController extends Controller
{
    private $pinduoduo;

    public function __construct()
    {
        $this->pinduoduo = new PinDuoDuo(config('pdd.jinbao'));
    }

    public function bounty(JinbaoRequest $request)
    {
        // 这里 id = 8502887091 写死了 确保可以获取到数据
        $info   = $this->pinduoduo->api->request('pdd.ddk.goods.detail', ['goods_id_list' => ['8502887091']]);
        $goods  = new JinbaoGoodsResource($info);

        // 下面两种都报错
        //  Trying to get property 'goods_name' of non-object
        return $goods->goods_name;

        //  Undefined index: goods_name
        return $goods['goods_name'];

        // return view('show', compact('goods'));
    }
}

但是 return $goods 可以返回数据

// return $goods
{
"mall_name": "壹周经营店",
"goods_name": "壹周护板吉他个性贴装饰民谣扫弦贴纸配件保护膜骚气木古典面板",
"goods_thumb": "https://t00img.yangkeduo.com/goods/images/2019-05-16/f001fa0e-7005-4915-b52c-9584b3592142.jpg",
"group_price": 1500,
"normal_price": 1800,
"coupon_discount": 100,
"coupon_quantity": 49000,
"promotion_rate": 180,
"sales_quantity": "990+"
}

// return dd($goods)
App\Http\Resources\JinbaoGoodsResource {#331 ▼
  +resource: array:1 [▼
    "goods_detail_response" => array:2 [▼
      "goods_details" => array:1 [▼
        0 => array:57 [▼
          "category_name" => "百货"
          "mall_name" => "壹周经营店"
          "goods_name" => "壹周护板吉他个性贴装饰民谣扫弦贴纸配件保护膜骚气木古典面板"
          "goods_image_url" => "https://t00img.yangkeduo.com/goods/images/2019-05-16/f001fa0e-7005-4915-b52c-9584b3592142.jpg"
          "coupon_total_quantity" => 50000
          。。。省去其他
        ]
      ]
      "request_id" => "15764620032738056"
    ]
  ]
  +with: []
  +additional: []
}

return $goods->goods_name;然后报错 Trying to get property 'goods_name' of non-object

return $goods['goods_name']; 也提示 Undefined index: goods_name

感觉 问题是不是在 JinbaoGoodsResource 返回的数据?
经过 JinbaoGoodsResource 处理后 返回的 不应该只是我需要的字段的么

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 7

获取非对象的属性。尝试用数组形式获取看看,要不就打印一下$goods的类型看看。

4年前 评论
xolee (楼主) 4年前

->withDefault()

4年前 评论
xolee (楼主) 4年前

没判断是否为空就去取值了

4年前 评论
xolee (楼主) 4年前
justmd5 (作者) 4年前
xolee (楼主) 4年前

很简单的一个问题,你 new 了一个 JsonResource 对象。
而这个对象本身,既没有 goods_name 属性,也不是一个数组。
当你 return 它的时候,它自己会调用自身 toArray 方法,要不你自己提前调用一下?
而且你也没必要这么写,resource 的作用不是数据过滤和重构么?

4年前 评论

@xolee 最后问题怎么处理了? 是

return $goods->toArray()['goods_name']

还是

return  optional($goods)->goods_name;

?
这个问题有意思

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!