Laravel资源集合中如何访问额外注入的参数?
解决方案
要在单个UserResource实例中获取控制器通过additional传递的全局参数,直接访问是行不通的——因为additional是附加到整个资源集合响应的顶层元数据,单个资源实例无法直接读取。推荐用以下两种方式实现需求:
方法一:给用户模型添加临时属性(最直接)
在控制器中给每个用户模型注入totalQuiz临时属性,资源内部直接读取该属性即可:
控制器修改后代码
$users = Users::with('UserQuiz')->get(); $totalQuiz = Quiz::count(); // 为每个用户模型添加临时属性 $users->each(function ($user) use ($totalQuiz) { $user->setAttribute('total_quiz', $totalQuiz); }); return response(['users' => UserResource::collection($users)]);
UserResource修改后代码
return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'quiz' => [ 'total' => $this->total_quiz, // 优化通过数计算,用集合方法替代foreach 'passed' => $this->UserQuiz->where('score', '>', 50)->count() ] ];
方法二:自定义集合资源(适合复杂场景)
如果需要保持additional的传递方式,可以自定义集合资源,在集合中处理每个用户的响应时传入全局参数:
自定义UserCollection资源
namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class UserCollection extends ResourceCollection { protected $totalQuiz; public function __construct($resource, $totalQuiz) { parent::__construct($resource); $this->totalQuiz = $totalQuiz; } public function toArray($request) { return $this->collection->map(function ($user) { return [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'quiz' => [ 'total' => $this->totalQuiz, 'passed' => $user->UserQuiz->where('score', '>', 50)->count() ] ]; }); } }
控制器调用代码
$users = Users::with('UserQuiz')->get(); $totalQuiz = Quiz::count(); return response(['users' => new UserCollection($users, $totalQuiz)]);
为什么原方法无法访问additional参数?
additional()方法是给整个响应的顶层添加元数据,最终返回的结构类似:
{ "users": [/* 用户数组 */], "totalQuiz": 10 }
单个UserResource实例只负责处理单个用户的数据,它的作用域仅限于当前用户模型,无法读取响应顶层的additional数据,因此需要通过上述方式将全局参数传递到每个资源实例中。
内容的提问来源于stack exchange,提问作者hretic
相关产品推荐
相关产品推荐

