Laravel 5.5中如何将控制器自定义数组转为API资源返回?
嘿,我来帮你解决这个问题!首先得指出你现有代码里的几个小问题,然后给你两种靠谱的解决方案:
首先,你当前的ExampleResource构造函数有两处明显问题:
$this->$info是变量变量的错误写法——你传入的$info是数组,这么写会试图把数组当作属性名,完全不符合预期;- 没有调用父类的构造函数
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
相关产品推荐
相关产品推荐

