PHP-从另一个对象检测对象上的更改

时间:2018-12-06 07:16:00

标签: php oop error-handling

我正在尝试处理用户从我的实体对象生成的错误。 为了做到这一点,我在我的实体对象中有一个errors属性。

我当前的问题是,某些实体具有实体作为属性,因此那些子实体也具有errors属性。

class Entities
{
  protected $errors = [];
  
  // methods...
}

class User extends Entities
{
  protected $nick
            $someStuff;

  public function setNickName($val)
  {
    if (empty($val))
    {
      $this->errors[] = 'Incorrect nick';
    }
    
    $this->nick = $val;
  }
  
  public function getNickName()
  {
    return $this->nick;
  }
  
  public function setSomeStuff(EntityObj $val)
  {
    $this->someStuff = $val;
  }
  
  public function getSomeStuff()
  {
    return $this->someStuff;
  }
}

class EntityObj extends Entities
{
  protected $something;
  
  public function setSomething($val)
  {
    if //some verifications
    {
      $this->errors[] = 'problem';
    }
    
    $this->something = $val;
  }
}

我想做的就是获取我的子实体的errors属性,将其放入我的errors主实体的属性中,这样我就可以轻松地在我的控制器。

是否可以从子实体检测我的errors变量上的更改,然后将其放在我的errors主实体上?到目前为止,我很难做到这一点。

1 个答案:

答案 0 :(得分:0)

我认为您不必将错误存储在实体本身中。 我不知道您在这里使用的PHP版本,所以我想给您一些方法。 如果您使用> PHP 7编写代码,则应该使用typehints。这会阻止该实体至少使用空值。

您可以从

转换代码
public function setNickName($val)
  {
    if (empty($val))
    {
      $this->errors[] = 'Incorrect nick';
    }

    $this->nick = $val;
  }

public function setNickName(string $val)
{
    $this->nick = $val;
}

但是我想您也不想将空字符串用作昵称,或者不想进行更多验证。在这种情况下,您对此类的使用期望没有得到满足,因此它可能会引发异常?每当您对应用程序的期望没有得到满足并且某些事情不正确时,它就会引发异常。

public function setNickName(string $val)
{
    if($this->nick === ''){
        throw new \UserException('Empty Nickname is not allowed.')
    }
    // more verification, more exceptions ...

    $this->nick = $val
}

但是您可以猜到,这是许多开发人员遇到的问题。看一下在经常使用的框架https://symfony.com/doc/current/components/validator.html的验证器组件中。

tl; dr: 删除errors属性,您不必在实体本身中存储错误。 如果您使用PHP 7或更高版本来阻止代码进行验证,请开始使用typehints,php可以自己处理部分代码。 也许可以使用现有的库来解决您的问题。