所以我创建了一个API资源,在 toArray()
方法中,我已经过滤了通过查询字符串返回的属性 . 我希望能够为我的大多数API资源执行此操作,因此将其转换为可重用的方法是有意义的 . 这样做的最佳方式是什么?
我正在考虑扩展基地 Resource
,但我不确定我会怎么做 . 或者它应该被移动到服务类或存储库中?
我的方法如下;
public function toArray($request)
{
if($request->fields) {
$fields = [];
$selectedFields = explode(',', $request->fields);
foreach($selectedFields as $field) {
if(isset($this->{$field})) {
$fields[$field] = $this->{$field};
}
}
return $fields;
} else {
return parent::toArray($request);
}
}
理想情况下,我想做点像......
public function toArray($request)
{
if($request->fields) {
return parent::filterFields($request); // Not sure whether it should be parent::, $this or something else?
} else {
return parent::toArray($request); // Not sure whether it should be parent::, $this or something else?
}
// or event just
return parent::filterFields($request); // Not sure whether it should be parent::, $this or something else?
}
完整课程:
ProjectResource.php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class ProjectResource extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
dd(parent::filterFields());
// or
dd($this->filterFields());
if($request->fields) {
$fields = [];
$selectedFields = explode(',', $request->fields);
foreach($selectedFields as $field) {
if(isset($this->{$field})) {
$fields[$field] = $this->{$field};
}
}
return $fields;
} else {
return parent::toArray($request);
}
}
}
Test.php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class Test extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function filterFields($request)
{
return 'test';
}
}
谢谢!
1 回答
如果您正在扩展该类,则可以使用
parent::
或$this->
. 区别是parent
将始终引用父类,如果当前类上不存在该方法,$this
将仅引用父类 . 因此,使用$this
允许扩展方法和属性 .例:
在更新的类表示中,您有两个扩展Resource的类,但ProjectResource将不知道Test中的方法 . 您需要ProjectResource来扩展Test,它还将继承Resource中的方法,因为Test扩展了Resource(多重继承) .
除此之外,您实施的方式将基于意见,您有很多选择 . 您可以扩展抽象类,可以使用专用过滤类,也可以使用特征 .