我对验证实体中的值的 OOP 策略有疑问。可以说我有这样的实体:
/*
* @ORM\Table()
* @ORM\Entity(repositoryClass="My\PageBundle\Entity\PageRepository")
*/
class File {
/*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/*
* @ORM\Column(name="type", type="string")
*/
private $type;
/*
* @ORM\ManyToOne(targetEntity="File")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
*/
private $parent;
}
现在我只想实体类型“父母”可能是父母。我可以通过两种方式做到这一点。
使用Symfony 回调验证:
if ($this->getParent() != null && $this->getParent()->getType() != 'group') $context->addViolationAt('parent', 'Invalid parent.', array() , 无效的);
这很明显,但仅在我调用验证器时才有效,或者
- 把这个逻辑放在 setter 中,就像在Symfony 书中提出的那样
您应该检查生成的实体并根据自己的需要调整 getter/setter 逻辑
setParent(File $parent) {
if ($parent->getType() != 'group')
throw new \Exception('Invalid parent');
$this->parent = $parent;
}
哪种方法更好?使用专门为此目的创建的验证约束或 getter 和 setter?如果使用验证 - 我应该始终使用默认的 getter 和 setter,还是我可以在其中做任何花哨(且有用)的事情(任何示例)?