所以我已经创建了一个API资源,并且在<div id="page-header">
<nav class="navbar"> </nav>
</div>
<script>
var flag = true;
$(window).on('scroll', function() {
if ( $(window).scrollTop() > 54 && flag ==true ) {
console.log('Event Fired');
$('#page-header nav').css({
'position': 'fixed',
'top': '-54px',
'width': '100%',
'z-index': '1000'
})
.animate({
top: '+=54px'
}, 500);
flag = false;
} else if ( $(window).scrollTop() === 0 ) {
$('#page-header nav').css({
'position': 'relative'
});
flag = true;
}
});
</script>
方法中,我已经过滤了通过查询字符串返回的属性。我希望能够为我的大多数API资源执行此操作,因此将其转换为可重用的方法是有意义的。这样做的最佳方式是什么?
我在考虑扩展基地toArray()
,但我不确定如何做到这一点。或者它应该被移动到服务类或存储库中吗?
我的方法如下;
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);
}
}
完整课程:
ProjectResource.php
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?
}
test.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);
}
}
}
谢谢!
答案 0 :(得分:2)
如果您要扩展课程,则可以使用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
在更新的类表示中,您有两个扩展Resource的类,但ProjectResource将不知道Test中的方法。您需要ProjectResource来扩展Test,它还将继承Resource中的方法,因为Test扩展了Resource(多重继承)。
除此之外,你如何实施将是基于意见的,你有很多选择。您可以扩展抽象类,可以使用专用过滤类,也可以使用特征。