Laravel:如何从控制器向Resource传递自定义变量
解决Laravel API Resource传递自定义变量到集合的问题
你当前的写法错误在于BookResource::collection()不支持直接传递自定义变量作为第二个参数,以下是两种可行的实现方案:
方案一:自定义Resource Collection(将变量注入每个资源项)
适合需要在每个资源对象中包含自定义变量的场景,步骤如下:
- 创建自定义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(); } }
- 修改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 ]; } }
- 更新控制器代码
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
相关产品推荐
相关产品推荐

