Laravel API 资源隐藏键
Posted
技术标签:
【中文标题】Laravel API 资源隐藏键【英文标题】:Laravel API resource hide key 【发布时间】:2020-03-30 05:02:21 【问题描述】:我有一个名为 FilmResource
的 API 资源,我已将一个名为 is_new
的新属性附加到模型中,并且我已将此新属性添加到资源文件中,问题是我有两个端点可以使用这个 API 资源的属性,它返回了两者的属性,但我只希望它返回一个方法,有没有一种方法可以指定要在响应中返回的某些键?如果我使用 makeVisible
没有区别,因为它只来自 API 资源。
电影控制器
这是我希望它返回的方法,我有另一个类似的方法,但我不希望它返回。
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 资源是否会覆盖您在隐藏/可见数组中设置的属性?
当您在控制器中返回某个密钥时,您能否指定要从 API 资源中隐藏它?
【问题讨论】:
您可以定义资源上的 api 响应。忘记可见和隐藏。在您的 FilmResource 上删除带有 is_new 的行,它将从您的回复中消失。 @EliasSoares 但是如果我希望它为一种方法响应而不是另一种方法响应返回呢? 所以这取决于你的逻辑。您可以使用 $request 来识别要返回的内容(例如通过检查方法)或拥有两个不同的资源(扩展最完整的资源并删除不需要的字段,因此您不会重复代码。) 您介意为我的案例发布一个示例吗? 您控制该类,如果您想定义是否要传递该字段,或者您希望如何传递,请向构造函数添加另一个参数 【参考方案1】:让我举例说明如何使用两种不同的 api 资源来解决您的问题。
在本例中,在创建 Film(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;
我的示例中使用的逻辑只是示例,您可能需要适应自己的需求并创建自己的逻辑。
【讨论】:
谢谢老兄,这对它的工作原理很有洞察力以上是关于Laravel API 资源隐藏键的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent API 资源:从响应(集合)中删除“数据”键
向 laravel 中的资源 json 响应添加状态和消息键