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

标签 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主实体的属性中,以便在 Controller 中轻松检索所有错误。

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

最佳答案

我认为您不必将错误存储在实体本身中。
我不知道您在这里使用的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可以自己处理部分代码。
也许使用现有的库来解决您的问题。

关于php - PHP-检测另一个对象上的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53646311/

相关文章:

c# - 测试对象以查看它是否实现接口(interface)有什么问题?

error-handling - 在丢失的 token 上输出适合上下文的错误消息

c - 如何判断在 C 中打开输入文件是否失败

PHP 复选框会更新数据库,但下拉菜单不会更新

php - 使用 php 向 mysql 表添加多个值

oop - 为什么 Rust 不支持特征对象向上转换?

java - Java 11 中使用泛型进行未经检查的方法 'sort(List<T>)' 调用

ruby - Sinatra Logger的Web服务错误

php - Laravel excel 库(Maat 网站): How to create a drop down list in exports

php - 在现有 MySQL 数据库上填充自动递增类型 ID?