질문을 삭제하지 말아주세요.!
 
1
0
-1

안녕하세요 오상택입니다.


Api 서버 구축 중에 문제가 생겨서 도움 좀 여쭙고자 합니다.


Dingo를 사용하기로 정했습니다 

Transformer를 만들어서

관계되는 필요한 데이터는

domain.com?include="foo" 와 같은 방법으로 진행 하려 합니다 


그런데 Eloquent로 만들어 지지 않은 모델이 있어서 

app(Dingo\Api\Transformer\Factory::class)->setAdapter(function ($app) {
    $fractal = new Dingo\Api\Transformer\Adapter\Fractal(new League\Fractal\Manager, 'include', ',');
    $fractal->disableEagerLoading();
    return $fractal;
});
  1. 위와 같은 방법으로 어댑터를 추가시켜 EagerLoading을 해제 했는데요 

그러면 EagerLoading이 필요하기 때문에 include로 파라미터가 넘어올 떄 해당 모델을 직접 with를 써줘야 하구요 


2. 해제 하지 않는다면 with를 안써줘도 되지만 Eloquent로 만들어지지 않은 모델을 include할 때 EagerLoading 못한다고 에러가 생기구요

더 큰 문제는 $availableIncludes 에 등록하지도 않았는데 include=에 관계되는 모델 이름을 넣으면 자동으로 include가 되네요 

보안 이슈가 생깁니다ㅠㅠ


그래서 

1번으로 하려고 하니

$inputs = explode(",", $request->input('include'));
if (in_array("foo", $inputs)) {
    $builder->with('foo');
}

이와 같은 코드를 입력해 줘야 되서 찝찝하고

이걸 넣지 않고 

2번으로 하자니 선언하지도 않은 모델이 노출돼서 기분이 좋지 않네요

선언한 모델만 include시키는 방법이 없을까요 


무엇인가 잘못됐다고 생각 드는 게 

Transformer에 $availableIncludes가 왜 존재하는 걸까요 


도와 주세요ㅠㅠ

    CommentAdd your comment...

    1 answer

    1.  
      1
      0
      -1

      딩고라는 특정 라이브러리를 사용해본 적이 없어서 정확한 답변은 아닙니다.

      1) 딩고에서는 엘로퀀트가 아닌 모델(Plain Old PHP Object 또는 배열)은 트랜스포머를 쓸 수 없나요? 

      2) \Illuminate\Database\Eloquent\Model 클래스에서 getRelations, getRelation, relationLoaded, setRelation, setRelations API를 찾아서 상택님 문제에 적용 가능한지 확인해 보시면 좋겠습니다 (e.g. Foo::setRelation('관계이름', null)).

      3) 그리고 ?includes=쿼리 파라미터는 딩고 설정 등에서 비활성화 할 수 있는 지도 확인해 보세요.

        CommentAdd your comment...