Laravel,可重复使用的API资源的方法
问题描述:
所以我创建了一个API资源,并在toArray()
方法,我已经过滤哪些属性通过查询字符串返回得到。我希望能够为我的大部分API资源执行此操作,因此将其转化为可重用的方法是有意义的。这样做的最好方法是什么?Laravel,可重复使用的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';
}
}
谢谢!
答
如果你扩展类,您可以使用parent::
或$this->
。不同的是parent
将始终引用父类,如果方法在当前类中不存在,$this
将仅引用父类。因此,使用$this
可以扩展方法和属性。
例子:
<?php
class A {
public function test() {
echo 'A';
}
}
class B extends A {
public function test() {
echo 'B';
}
public function callParent(){
parent::test();
}
public function callThis() {
$this->test();
}
}
$b = new B();
$b->callParent(); // Echoes A
$b->callThis(); // Echos B
在更新后的类表示,必须扩大资源,但ProjectResource不会有任何关于测试方法的想法两类。您需要使用ProjectResource来扩展Test,由于Test扩展了资源(多重继承),所以它也会继承Resource的方法。
除此之外,你如何实现将基于意见,你有很多选择。你可以扩展一个抽象类,你可以使用一个专用的过滤类,或者你可以使用一个特征。
我都尝试,但既不工作,'get_parent_class'返回资源类,但是当我尝试'父:: filterFields()'或'$这个 - > filterFields()'我得到'调用未定义的方法应用程序\项目:: filterFields()',所以它看起来像指的是一个不同的类? – KeironLowe
你可以发布你的完整课程吗? – Devon
已完成,我已更新我的问题 – KeironLowe