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

Laravel:如何从控制器向Resource传递自定义变量

解决Laravel API Resource传递自定义变量到集合的问题

你当前的写法错误在于BookResource::collection()不支持直接传递自定义变量作为第二个参数,以下是两种可行的实现方案:

方案一:自定义Resource Collection(将变量注入每个资源项)

适合需要在每个资源对象中包含自定义变量的场景,步骤如下:

  1. 创建自定义Collection类
namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\ResourceCollection;

class BookCollection extends ResourceCollection
{
    private $pass;

    public function __construct($resource, $pass)
    {
        parent::__construct($resource);
        $this->pass = $pass;
    }

    public function toArray($request)
    {
        return $this->collection->map(function ($book) use ($request) {
            return new BookResource($book, $this->pass);
        })->all();
    }
}
  1. 修改BookResource,添加构造函数接收变量
namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class BookResource extends JsonResource
{
    private $pass;

    public function __construct($resource, $pass = null)
    {
        parent::__construct($resource);
        $this->pass = $pass;
    }

    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'isbn' => $this->isbn,
            'title' => $this->title,
            'description' => $this->description,
            'published_year' => $this->published_year,
            'authors' => AuthorResource::collection($this->authors),
            'review' => BookReviewResource::collection($this->reviews),
            'pass' => $this->pass
        ];
    }
}
  1. 更新控制器代码
public function index(Request $request)
{
    $books = Book::with('authors')->paginate(5);
    $pass = 1;

    return new BookCollection($books, $pass);
    // 如需指定HTTP状态码,可包裹为:
    // return response()->json(new BookCollection($books, $pass), 200);
}

方案二:使用additional方法添加顶层元数据

如果只需要将自定义变量作为返回结果的顶层字段(而非每个资源项内),可以直接使用additional方法:

控制器代码修改为:

public function index(Request $request)
{
    $books = Book::with('authors')->paginate(5);
    $pass = 1;

    return BookResource::collection($books)->additional([
        'pass' => $pass
    ]);
}

返回的JSON结构示例:

{
    "data": [
        {
            "id": 1,
            "isbn": "978-xxx",
            // ...其他书籍字段
        }
    ],
    "pass": 1,
    "links": {
        // 分页链接
    },
    "meta": {
        // 分页元数据
    }
}

内容的提问来源于stack exchange,提问作者info.dava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:15:36