2014-12-29 3 views
2

엔티티의 여러 번역을 제공하기 위해 langtranslation_of 속성 (또한 https://stackoverflow.com/a/7299777/1453912 참조) 모델을 사용하는 Multilingual이라는 특성이 있습니다.특성에서 Laravel 모델 특성을 구성하는 방법은 무엇입니까?

$model->toArray()이 호출 될 때 translation_of 필드를 모델에서 숨기고 싶습니다.이 필드는 $hidden 속성에 추가하여 쉽게 처리 할 수 ​​있습니다. 이와 같이 :

class Model { 
    use Multilingual; 

    protected $hidden = ['translation_of']; 
} 

원래 모델을 깨끗하게 유지하려면 사용 된 특성을 통해 숨겨진 필드를 추가하고 싶습니다.

나는 시도했다 :

  1. 이 허용되지 않는 특성에 protected $hidden = ['translation_of']; 추가 : Undefined: trait declaration of property 'hidden' is incompatible with previous declaration

    을 또한 매우 확장하지 (그것은 클래스의 $hidden 속성에 의해 오버라이드 (override) 할 것입니다, 나는 생각 ..)

  2. 이 특성에 부팅 방법을 추가 :

    static function bootMultilingual() { 
        static::$hidden[] = 'translation_of'; 
    } 
    

    스코프로 인해 (의심 스러울 정도로) 허용되지 않는 것입니다.

어떻게해야할까요?

도와주세요!


참고 : 내부적으로

  1. : 외부 $this->hidden[] = 'translation_of';
  2. : $model->setHidden(array_merge($model->getHidden(), ['translation_of']));

답변

2

당신은 메소드를 오버라이드 (override) 할 수 나는이 두 가지 방법으로 수행 할 수 있습니다 생각, 동적 유지하려면 여기서 $this->hidden이 실제로 사용됩니다. 그리고 그게 getArrayableItems

trait Multilingual { 

    protected function getArrayableItems(array $values) 
    { 
     if(!in_array('translation_of', $this->hidden)){ 
      $this->hidden[] = 'translation_of'; 
     } 
     return parent::getArrayableItems($values); 
    } 
} 
관련 문제