Laravel,可重用的API资源方法

时间:2017-09-29 12:40:41

标签: laravel api resources extend

所以我已经创建了一个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);
        }
    }
}

谢谢!

1 个答案:

答案 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(多重继承)。

除此之外,你如何实施将是基于意见的,你有很多选择。您可以扩展抽象类,可以使用专用过滤类,也可以使用特征。