2014-07-26 3 views
1

나는 데이터베이스에서 사용자를 불러오고 웅변적인 객체를 사용자에게 반환하는 간단한 컨트롤러를 가지고있다.Laravel의 컨트롤러에서 Eloquent Model을 반환 한 후 기본 응답 동작을 확장하는 방법은 무엇입니까?

class UsersController extends \BaseController { 

    public function show($id) 
    { 
     $user = User::find($id); 

     return $user; 
    } 

} 

기본적으로 Laravel은 JSON을 반환합니다. 내가 대신 그것은 잘 작동하고 있지만 불편 매크로

Response::macro('rjson', function($collection) 
{ 
    if($collection instanceof Illuminate\Database\Eloquent\Collection) 
    { 
     $collection = $collection->toArray(); 
    } 

    $collection = Dmitrirussu\RJson::pack($collection); 
    return \Response::make($collection); 
}); 

을 다음 내가 만든 RJSON를 반환하고 싶습니다. 컨트롤러에서 return $user과 동일한 동작을하고 싶습니다. 나는 에 보람 효과가없는 json 방법을 확장하려고 시도했다. 내가 어떻게 이걸 이룰 수 있니?

+0

; '와'return Response :: json ($ user);', 최초의 호출 [toJson 메소드] (https://github.com/laravel/framework/blob/master/src/Illuminate/Support/Collection.php#L718)),'dd (debug_backtrace());'를 호출하여 PHP 백 트레이스를 생성하십시오. – Razor

답변

3

여기 해결책을 제안하려고합니다. 여기서 코드를 테스트하지는 않았지만이 접근법은 앞으로 며칠 내에 구현하고자하는 것과 매우 유사합니다 (Ember.js 호환성에 대한 Eloquent 결과 다시 정의).

기본적으로 Taylor Otwell (creator of Laravel) suggested이 무엇 :

체크 아웃 웅변 \ 모델 클래스의 "newCollection"방법. 기본 모델에서이를 재정의하고 Illuminate \ Database \ Eloquent \ Collection을 확장하는 사용자 지정 컬렉션을 반환하십시오. 그런 다음 컬렉션 확장은 toArray 메서드를 재정 의하여 원하는 방식으로 서식을 지정합니다.

그래서 이론적으로는이 세 가지 단계를 할 수있는 :

  1. Illuminate\Database\Eloquent\Collection의 서브 클래스를 생성하고 반환하기 전에 toArray()이 RJSON 서식을 할 우선합니다. 전화를 RJsonCollection이라고 가정 해 봅시다.
  2. RJsonCollection 하위 클래스를 사용하려면 newCollection() 메서드를 재정의하는 Illuminate\Database\Eloquent\Model의 하위 클래스를 만듭니다. 전화 번호는 BaseModel입니다.
  3. 모델을 변환하여 새로운 BaseModel을 확장하십시오. 이 같은

뭔가 :

응용 프로그램/모델/RJsonCollection.php :

<?php 

class RJsonCollection extends Illuminate\Database\Eloquent\Collection 
{ 
    public function toArray() 
    { 
     $parentArray = parent::toArray(); 

     return Dmitrirussu\RJson::pack($parentArray); 
    } 
} 

주 내가 Dmitrirussu\RJson::pack($parentArray)이 컬렉션을 반환 할 것입니다 귀하의 질문의 코드를 기반으로 믿고있어 /정렬. 위의 코드를 조정하고 올바른 RJSON 배열을 반환해야합니다.

응용 프로그램/모델/BaseModel.php :

<?php 

class BaseModel extends Eloquent 
{ 
    public function newCollection(array $models = array()) 
    { 
     return new RJsonCollection($models); 
    } 
} 

응용 프로그램/모델/UserModel.php :

<?php 

class UserModel extends BaseModel 
{ 
    // ... 
} 

물론 보통 composer dump-autoload 물건의 새로운 클래스를 만드는 . 위의 모든 클래스를 models 폴더에 놓았고 네임 스페이스가 없다는 것을 알 수 있습니다. 모범 사례는 아니지만 예제를 간단하고 간단하게 유지하는 데 도움이됩니다.

+0

니스. 당신은 그'use' 문을 btw 할 필요가 없습니다. 또한'BaseModel'은 OP의 요구 사항을 충족시키기 위해 커스텀'toArray()'메소드를 필요로합니다. –

+0

@deczo "두 파일 모두에서"사용 "문이 필요합니다. 사용은 파일 수준 키워드이며 상속의 영향을받지 않습니다." http://stackoverflow.com/questions/11794901/php-does-extending-class-need-another-use-to-call-namespace에서 다시 확인해 주시겠습니까? – Unnawut

+0

@deczo 귀하의 의견의 두 번째 부분에 대한, 나는 당신이 주석으로 같은 시간에 바로 RJsonCollection 예제에서 내 가정의 작은 메모를 추가했습니다 : p – Unnawut

0
또한 더 일반적인 방법으로 개인 정보에 대한 재사용 가능한 변환을 생성하는 방법으로 프랙탈의 변압기를보고 할 수 있습니다

: 리턴 $ 사용자`의 차이가 있기 때문에

http://fractal.thephpleague.com/transformers/

관련 문제