让我举例说明如何使用两种不同的 api 资源来解决您的问题。
在这个例子中,当创建一个电影(api store 方法)时,我们将显示所有字段,但是在可视化(api show 方法)时,我们将只显示几个字段:
namespace App\Http\Resources\Film;
use Illuminate\Http\Resources\Json\JsonResource;
class Store extends JsonResource {
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'description' => $this->description,
'name' => $this->name,
'is_new' => $this->is_new
];
}
}
和
namespace App\Http\Resources\Film;
class Show extends Store {
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return Arr::except(
parent::toArray($request),
[
'is_new'
]
);
}
}
请注意,我们是从最完整的响应写到不太完整的响应,所以我只有一个类具有关于如何输出数据的完整定义,而其他类通过删除一些字段来使用它(并且还可以进行任何需要的转换)。
我建议的另一种方法是使用请求来知道要显示什么,但我不喜欢这个解决方案,因为它没有完全解耦,你的资源需要知道你的路线,这不是他的工作 IMO。
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class Film extends JsonResource {
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$data = [
'id' => $this->id,
'description' => $this->description,
'name' => $this->name
];
if ($request->isMethod('post')) {
$data['is_new'] = $this->is_new;
}
return $data;
}
}
我的示例中使用的逻辑只是示例,您可能需要适应自己的需求并创建自己的逻辑。