我正在尝试处理用户从我的实体对象生成的错误。
为了做到这一点,我在我的实体对象中有一个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/