2017-09-29 8 views
1

APIリソースを作成しました。toArray()メソッドでは、どの属性がクエリ文字列で返されるかをフィルタリングしました。私は、APIリソースのほとんどでこれを実行できるようにしたいので、これを再利用可能なメソッドに移すのが理にかなっています。これを行う最善の方法は何でしょうか?Laravel、Reusable APIリソースメソッド

私は基本Resourceの延長を考えていたが、私はそれをやって行くだろうかどうかはわかりません。または、サービスクラスまたはリポジトリに移動する必要がありますか?

私の方法は以下の通りです。 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を

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? 
} 

全クラスたいです

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を拡張し、両方のクラスを持っています。 Testを拡張するにはProjectResourceが必要です。これは、TestがResource(複数の継承)を拡張して以来、Resourceからメソッドを継承します。


これを超えると、実装方法は意見に基づいて行われ、多くのオプションがあります。抽象クラスを拡張したり、専用のフィルタリングクラスを使用したり、特性を使用することができます。

+0

私はどちらもが、両方を試していないリソースクラスを返しget_parent_class' '、働いていたが、私は、'親:: filterFields() 'や'ます$ this-> filterFields() '私は'未定義のメソッドのApp \プロジェクトに呼び出しますしようとすると、 :: filterFields() '、それは別のクラスを参照しているようです? – KeironLowe

+0

フルクラスを投稿できますか? – Devon

+0

私の質問が更新されました – KeironLowe