2017-09-29 159 views
1

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

谢谢!

回答

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 

在更新后的类表示,必须扩大资源,但ProjectResource不会有任何关于测试方法的想法两类。您需要使用ProjectResource来扩展Test,由于Test扩展了资源(多重继承),所以它也会继承Resource的方法。


除此之外,你如何实现将基于意见,你有很多选择。你可以扩展一个抽象类,你可以使用一个专用的过滤类,或者你可以使用一个特征。

+0

我都尝试,但既不工作,'get_parent_class'返回资源类,但是当我尝试'父:: filterFields()'或'$这个 - > filterFields()'我得到'调用未定义的方法应用程序\项目:: filterFields()',所以它看起来像指的是一个不同的类? – KeironLowe

+0

你可以发布你的完整课程吗? – Devon

+0

已完成,我已更新我的问题 – KeironLowe

相关问题