gpt4 book ai didi

laravel-5 - Laravel 5.6 - 将附加参数传递给 API 资源?

转载 作者:行者123 更新时间:2023-12-02 22:08:01 26 4
gpt4 key购买 nike

Laravel API Resource可以是单个资源,也可以是集合。在某些情况下,需要将附加参数从 Controller 传递到资源/集合。下面是一个简单的示例,演示了使用 User 作为单个/集合资源以及要传递给资源以进行输出的自定义 $apple 参数的问题。该问题可以在下面的最终输出(集合)中看到,其中对于fruit值,我们得到了错误的banana值第一个用户,而不是正确的 apple 值(所有其他用户都会获得)。它非常适合单个输出,但不适用于集合。见下文:

带有 UserResource 的 Controller (单个)

    $user = User::first();
return new UserResource($user, $apple = true); // $apple param passed

带有 UserResource(集合)的 Controller

    $users = User::limit(3)->get();
return UserResource::collection($users, $apple = true); // $apple param passed

用户资源

    <?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 通常在资源文件中执行以操作集合的输出。如何做到这一点?

最佳答案

以下方法对我有用:

用户资源

class UserResource extends Resource{

protected $foo;

public function foo($value){
$this->foo = $value;
return $this;
}

public function toArray($request){
return [
'id' => $this->id,
'name' => $this->name,
'foo' => $this->foo,
];
}

public static function collection($resource){
return new UserResourceCollection($resource);
}
}

用户集合

class UserResourceCollection extends ResourceCollection{

protected $foo;

public function foo($value){
$this->foo = $value;
return $this;
}

public function toArray($request){
return $this->collection->map(function(UserResource $resource) use($request){
return $resource->foo($this->foo)->toArray($request);
})->all();

// or use HigherOrderCollectionProxy
// return $this->collection->each->foo($this->foo)->map->toArray($request)->all()

// or simple
// $this->collection->each->foo($this->foo);
// return parent::toArray($request);
}
}

传递附加参数的不同方式

(new UserResource($user))->foo('bar');
(new UserResourceCollection($user))->foo('bar');

UserResource::make($user)->foo('bar');
UserResourceCollection::make($users)->foo('bar');
UserResource::collection($users)->foo('bar');

关于laravel-5 - Laravel 5.6 - 将附加参数传递给 API 资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50638257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com