2017-04-18 2 views
0

현재 상태가 미리 정의 된 상태의 사용자 엔터티가 있습니다. 사용자는 기본적으로 STATUS_NOT_CONFIRMED를가집니다. $ 사용자 -처럼 하나의 방법을 사용하여사용자 상태 처리 방법

  • > changeStatusTo ($ :

    interface UserInterface 
    { 
        const STATUS_ENABLED = 1; 
        const STATUS_DISABLED = 2; 
        const STATUS_BANNED = 3; 
        const STATUS_NOT_CONFIRMED = 4; 
    } 
    

    는하지만 사용자를 관리하는 가장 좋은 (또는 더 나은) 방법은 상태들 무엇 의 문제와 붙어있어 status)는 $ user-> setStatus ($ status)와 유사합니다.

  • $ user-> enable(), $ user-> disable(), $ user-> ban()와 같은 메소드를 생성합니다.이 메소드는 앞으로 더 많은 상태가 있으면 더 웅변하지만 문제가 발생할 수 있습니다.

감사합니다. 감사합니다. 감사합니다.

+0

는, 첫 번째 옵션은 2 일보다 더 아래 방법으로 동적으로 일정 확인하기 위해 제안 할 수 있습니다. 하나의 메소드를 사용하여 응용 프로그램에서 동적 상태 수를 처리 할 수 ​​있도록 상태를 설정하십시오. 첫 번째 옵션을 사용하면 유지 관리가 훨씬 쉬워집니다. – prava

+0

두 번째 방법을 선호합니다. 사용자의 개인 함수로 changeStatus를 넣을 수 있지만 사용자가 매개 변수없이 특정 작업을 수행해야합니다. – 4EACH

+0

@ 4EACH 답장을 보내 주셔서 감사합니다. 설명해 주시겠습니까? 왜 제 1 옵션보다 제 2 옵션을 선호합니까? – Shandur

답변

1

두 변종을 만들고 서로 전화하게합니다. 따라서 ban으로 전화하면 setStatus으로 전화 할 것입니다. 나중에 새 상태를 추가하면 setStatus를 확장 할 수 있으며 실제로 필요한 경우 새 메소드를 추가 할 수 있습니다.

나는 UserInterface 인터페이스를 확장하여 최대 값을 저장합니다. 그렇게하면 setStatus 메소드를 건드리지 않고 인터페이스를 변경할 수 있습니다.

interface UserInterface 
{ 
    const STATUS_ENABLED = 1; 
    const STATUS_DISABLED = 2; 
    const STATUS_BANNED = 3; 
    const STATUS_NOT_CONFIRMED = 4; 

    const STATUS_MAX = self::STATUS_NOT_CONFIRMED; 
} 

class User implements UserInterface { 

    // ... 
    function setStatus($status) { 
     if ($status < 0 || $status > UserInterface::STATUS_MAX) { 
      throw InvalidArgumentException('status'); 
     } 
     $this->status = $status; 
    } 

    function ban() { 
     $this->setStatus(UserInterface::STATUS_BAN); 
    } 
    // ... 

} 
+0

답변 해 주셔서 감사합니다. 나는 그것을 좋아한다. 방금 ​​생각했습니다 : User 엔터티에 대한 작업을 처리하는 UserService 클래스를 만드는 경우입니다. $ userService-> banUser ($ userId) 등의 메소드를 가지며, 사용자는 위에서 설명한대로 setStatus (..) 메소드 만 가질 수 있습니다. 당신이 그것에 대해 어떻게 생각하십니까? – Shandur

+0

이 imho를 구현하기 위해 UserService를 생성하는 것은 사용자 모델이 현재 모르는 경우 자신의 데이터를 저장하는 방법과 지속성을 위해 외부 클래스를 호출해야한다는 것을 의미합니다. 지속성을 위해 외부 클래스가 필요하고 setStatus가 실제로 UserService를 호출하면 아무런 문제가 없습니다. 하나의 모델에 대한 퍼시스턴스 로직을 여러 클래스에 분산 시켜서는 안됩니다. 그렇지 않으면 어떤 문제가 생길 때 문제가 발생합니다. – Philipp

+0

내 모델에서 지속성에 대해 아무것도 모르는 경우 지속성 작업에 doctrine을 사용합니다. enable(), disable() 및 ban() 메서드가 포함 된 UserService를 사용한다는 의미입니다. 그리고이 메소드는 User 모델의 setStatus (..)를 호출합니다. UserService의 예제 : function banUser ($ userId) {$ user = $ this-> userRepo-> find ($ userId); $ user-> setStatus (BANNED)}; – Shandur

0

난 후 UserInterface 마법의 방법 __get()를 사용하여 내로

<?php 

interface UserInterface 
{ 
    const STATUS_ENABLE = 1; 
    const STATUS_DISABLE = 2; 
    const STATUS_BAN = 3; 
    const STATUS_NOT_CONFIRM = 4; 
    const STATUS_DEFAULT = self::STATUS_NOT_CONFIRM; 
} 

class User implements UserInterface{ 
    public $status = UserInterface::STATUS_DEFAULT; 
    private function setStatus($status) { 
     if ($status < 0 || $status > UserInterface::STATUS_DEFAULT) { 
      throw InvalidArgumentException('status'); 
     } 
     $this->status = $status; 
    } 
    public function getStatus() { 
     return $this->status; 
    } 

    function __call($fn_name,$args) 
    { 
     if(strpos($fn_name,'make')==0) 
     { 
      $statusChangeTo = "STATUS_".strtoupper(substr($fn_name,4)); 
      $constant= 'UserInterface::'.$statusChangeTo; 
      if(defined($constant)) 
      { 
       $this->setStatus(constant($constant)); 
      } 
      else 
      { 
       throw new Exception("Invalid method ".$fn_name); 
      } 
     } 
     else 
     { 
      throw new Exception("Invalid method ".$fn_name); 
     } 
    } 

} 
$user= new User(); 
var_dump($user->getStatus()); 
$user->makeBan(); 
var_dump($user->getStatus()); 
?> 
+0

답장을 보내 주셔서 감사합니다.하지만 마법 방법을 사용하는 방법이 맘에 들지 않습니다. – Shandur

+0

마법 방법을 사용하지 않고 @Shandur는 없습니다. 동적 상태를위한 동적 함수 구현 –