You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5.5中如何将控制器自定义数组转为API资源返回?

嘿,我来帮你解决这个问题!首先得指出你现有代码里的几个小问题,然后给你两种靠谱的解决方案:

首先,你当前的ExampleResource构造函数有两处明显问题:

  1. $this->$info是变量变量的错误写法——你传入的$info是数组,这么写会试图把数组当作属性名,完全不符合预期;
  2. 没有调用父类的构造函数parent::__construct($data),Laravel的Resource类默认会把传入的内容赋值给$this->resource属性,跳过这个会破坏Resource的核心逻辑。

方案1:利用Resource默认的$this->resource属性(推荐)

Laravel的API Resource本身就支持传入数组、普通对象或者模型,不需要自定义构造函数。你可以直接通过$this->resource访问传入的数据:

控制器代码(可直接使用)

public function getExample(){ 
    $attribute = ['otherInfo' => 'info']; 
    // 可选:把数组转成对象,这样可以用属性访问(比如$this->otherInfo)
    // $attribute = (object) ['otherInfo' => 'info'];
    return new ExampleResource($attribute); 
}

ExampleResource代码

class ExampleResource extends Resource { 
    public function toArray($request) { 
        return [ 
            // 如果传入的是数组,用数组索引访问
            'info' => $this->resource['otherInfo'], 
            // 如果转成了对象,直接用属性访问
            // 'info' => $this->otherInfo,
        ]; 
    } 
}

方案2:自定义属性(如果确实需要单独存储)

如果你一定要把info作为资源类的私有属性,记得必须调用父类构造函数,同时正确赋值:

ExampleResource代码

class ExampleResource extends Resource { 
    private $info; 

    public function __construct($data) { 
        // 必须先调用父类构造函数,保留Resource的默认行为
        parent::__construct($data); 
        // 从传入的数据中提取需要的字段
        $this->info = $data['otherInfo']; 
    } 

    public function toArray($request) { 
        return [ 
            'info' => $this->info, 
            // 如果需要,还可以访问$this->resource里的其他数据
        ]; 
    } 
}

其实方案1更符合Laravel Resource的设计初衷,它能灵活处理各种类型的输入,不需要额外维护自定义属性,推荐你优先使用这个方式。

内容的提问来源于stack exchange,提问作者Jonio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:45:26