2017-09-29 17 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'는 Resource 클래스를 반환하지만'parent :: filterFields()'또는'$ this-> filterFields()'를 호출하면'정의되지 않은 메소드 App \ Project :: filterFields()', 다른 클래스를 참조하는 것처럼 보입니까? – KeironLowe

+0

전체 수업을 게시 할 수 있습니까? – Devon

+0

완료했습니다. 질문을 업데이트했습니다. – KeironLowe