首页 文章

Laravel,可重用的API资源方法

提问于
浏览
1

所以我创建了一个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 回答

  • 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(多重继承) .


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

相关问题