Laravel的API资源可以是单个资源或集合。在某些情况下,需要从控制器向资源/集合传递额外的参数。以下是一个简单的示例,使用User
作为单个/集合资源,并使用自定义的$apple
参数传递到资源以进行输出。问题可以在最后的输出(集合)
中看到,在其中对于fruit
值,我们得到了第一个用户的错误值为banana
,而不是正确的apple
值(所有其他用户都得到)。它对于单个输出完美地工作,但对于集合则不然。请参见以下内容:
带UserResource的控制器(单个)
$user = User::first();
return new UserResource($user, $apple = true); // $apple param passed
使用UserResource(集合)的控制器
$users = User::limit(3)->get();
return UserResource::collection($users, $apple = true); // $apple param passed
UserResource
:用户资源。 <?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource {
private $apple;
public function __construct($resource, $apple = false) {
// Ensure we call the parent constructor
parent::__construct($resource);
$this->resource = $resource;
$this->apple = $apple; // $apple param passed
}
public function toArray($request) {
return [
'id' => (int) $this->id,
'name' => $this->name,
'fruit' => $this->apple ? 'apple' : 'banana',
];
}
}
输出(单个)
{
"data": {
"id": 1,
"name": "Peter",
"fruit": "apple" // correct param!
}
}
输出(集合)
{
"data": [
{
"id": 1,
"name": "Peter",
"fruit": "banana" // INCORRECT param!
},
{
"id": 2,
"name": "Lois",
"fruit": "apple" // correct param!
},
{
"id": 3,
"name": "Brian",
"fruit": "apple" // correct param!
}
]
}
请注意,这只是一个示例,它可以是任何数量的随机参数(与User
集合无关,但必须传递给输出逻辑),例如来自不同表格的单个值read_at
时间戳,我想在资源集合中传递一次,并在输出之前对其进行一些逻辑处理(如与用户时间戳比较),或者传递其他参数进行附加逻辑if/else
以便在资源文件中进行操作,以操纵集合的输出。怎样做呢?