2016-06-09 9 views
0

나는 가끔이재사용 접근 및 뮤 테이터 내 모델의 여러에서

public function setTotalAttribute($value) 
{ 
    return $this->attributes['total'] = $value * 100; 
} 

public function getTotalAttribute($value) 
{ 
    return $value * 0.01; 
} 

내가 구입 또는 가격이라고 돌연변이하고있는 분야지만, 코드 같은 코드가 799에 7.99을 변경 (동일해야 DB에 저장하고 반환시 다시 변경).

모든 필드의 특성이 같을 수는 있지만 특성이 약간 다를 수 있습니다. 자동 설치되는 날짜 필드와 비슷한 설정이 가능합니까?

+0

'traits' (PHP> = 5.5)를 사용할 수 있습니다. 아니면'추상적 인 '클래스. – DanFromGermany

+0

@DanFromGermany 필드의 이름이 다른 모델에 따라 다르므로 특성을 사용할 수 없다고 언급했습니다. 뭔가를 놓치지 않으면 ... – Wizzard

답변

0

하나의 해결책은 해당 필드가있는 모델에서 달러/센트 변환을 처리하는 필드를 정의한 다음 특성을 사용하여 전역 변경자/접근자를 무시하는 것입니다.

class Model 
{ 
    use HasMoneyFields; 

    protected $moneyFields = ['purchase', 'price', 'total']; 
} 

trait HasMoneyFields 
{   
    public function getAttributeValue($key) 
    { 
     $value = parent::getAttributeValue($key); 

     if (property_exists($this, 'moneyFields')) { 
      if (in_array($key, $this->moneyFields)) { 
       $value /= 100; 
      } 
     } 

     return $value; 
    } 

    public function setAttribute($key, $value) 
    { 
     parent::setAttribute($key, $value); 

     if (property_exists($this, 'moneyFields')) { 
      if (in_array($key, $this->moneyFields)) { 
       $this->attributes[$key] = $value * 100; 
      } 
     } 
    } 
} 
+0

매우 유망 해 보입니다! 참고, 나는 나누기 대신 $ value * 0.01을 사용하므로 0 (0으로 나누기)을 확인하고 처리 할 필요가 없습니다. 감사! – Wizzard

+0

한 가지 단점은 매직 콜이 비싸고 PHP가 코드를 최적화 할 수 없으며 적절한 메소드 정의보다 느릴 것이라는 점입니다. – DanFromGermany

+0

또 다른 단점은 한 번만 할 수 있다는 것입니다. 같은 시간에 사용되는 두 가지 다른 특성에서 동일한 함수 이름을 사용할 수 없기 때문에 Money에 대해이 작업을 수행 한 다음 다른 작업을 수행하는 것은 실패합니다. – Wizzard