Laravel API 资源隐藏键
Laravel API resource hide key
我有一个名为 FilmResource
的 API 资源,我已将一个新属性附加到名为 is_new
的模型,并将此新属性添加到资源文件中,问题是我有两个使用此 API 资源的端点,它 returning 了两者的属性,但我只希望它 returned 用于一种方法,有没有办法可以在响应中指定某些键 returned 吗?如果我使用 makeVisible
它没有任何区别,因为它仅来自 API 资源。
电影控制器
这是我想要的方法return,我有另一种类似的方法,但我不想要它return。
public function show(string $id)
{
$film = Film::findOrFail($id);
return new FilmResource($film);
}
电影资源
public function toArray($request)
{
return [
'id' => $this->id,
'description' => $this->description,
'name' => $this->name,
'is_new' => $this->is_new
}
API 资源是否会覆盖您在 hidden/visible 数组中设置的属性?
当您在控制器中 return 时,您能否指定要从 API 资源中隐藏密钥?
让我举例说明如何使用两种不同的 api 资源来解决您的问题。
在这个例子中,当创建一个电影(api 存储方法)时,我们将显示所有字段,但在可视化时(api 显示方法)我们将只显示几个字段:
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'
]
);
}
}
请注意,我们是从最完整的回复到不太完整的回复,所以我只有一个 class 具有关于如何输出数据的完整定义,其他 classes通过删除一些字段来使用它(也可以进行任何所需的转换)。
我建议的另一种方法是使用请求来了解要显示的内容,但我不喜欢这个解决方案,因为它没有完全分离,你的资源需要知道你的路线,这不是他的工作 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;
}
}
我的示例中使用的逻辑只是示例,您可能需要适应自己的需要并创建自己的逻辑。
我有一个名为 FilmResource
的 API 资源,我已将一个新属性附加到名为 is_new
的模型,并将此新属性添加到资源文件中,问题是我有两个使用此 API 资源的端点,它 returning 了两者的属性,但我只希望它 returned 用于一种方法,有没有办法可以在响应中指定某些键 returned 吗?如果我使用 makeVisible
它没有任何区别,因为它仅来自 API 资源。
电影控制器
这是我想要的方法return,我有另一种类似的方法,但我不想要它return。
public function show(string $id)
{
$film = Film::findOrFail($id);
return new FilmResource($film);
}
电影资源
public function toArray($request)
{
return [
'id' => $this->id,
'description' => $this->description,
'name' => $this->name,
'is_new' => $this->is_new
}
API 资源是否会覆盖您在 hidden/visible 数组中设置的属性?
当您在控制器中 return 时,您能否指定要从 API 资源中隐藏密钥?
让我举例说明如何使用两种不同的 api 资源来解决您的问题。
在这个例子中,当创建一个电影(api 存储方法)时,我们将显示所有字段,但在可视化时(api 显示方法)我们将只显示几个字段:
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'
]
);
}
}
请注意,我们是从最完整的回复到不太完整的回复,所以我只有一个 class 具有关于如何输出数据的完整定义,其他 classes通过删除一些字段来使用它(也可以进行任何所需的转换)。
我建议的另一种方法是使用请求来了解要显示的内容,但我不喜欢这个解决方案,因为它没有完全分离,你的资源需要知道你的路线,这不是他的工作 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;
}
}
我的示例中使用的逻辑只是示例,您可能需要适应自己的需要并创建自己的逻辑。