我已经阅读了如何使用 sf2 在服务器端验证表单。解决方案是使用实体中的约束作为注释、validation.yml 或在 EntityType (Form) 内部。
一切都很好,但是,所有这些验证都只适用于表单。但是当您实例化一个新对象并尝试持久化时,验证不起作用。
我会给你一个例子。
想象一下我有一个用户实体:
/**
* @ORM\Entity
* @ORM\Table(name="sf_user")
*/
class User{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORM\Column( name="username", type="string", length=50, unique=true )
*/
protected $username;
/**
* @var string
* @ORM\Column( name="email", type="string", length=100, unique=true )
*/
protected $email;
public static function loadValidatorMetadata(\Symfony\Component\Validator\Mapping\ClassMetadata $metadata)
{
$metadata->addPropertyConstraint('username', new \Symfony\Component\Validator\Constraints\NotBlank());
$metadata->addPropertyConstraint('email', new \Symfony\Component\Validator\Constraints\NotNull());
}
}
然后,在某些控制器中,我尝试使用以下方式保存我的表单:
$this->form = $this->create(new UserType());
$this->form->setData(new User());
$this->form->bind($this->request);
if( $this->form->isValid())
{
//Persist with entity manager
}
一切都很完美,因为我的实体和表单之间存在关联。但是如果我需要实例化一个没有表单的对象会发生什么?我应该做这样的事情:
$user = new User();
$user->setUsername("username");
//Persist with entity manager
如果我这样做,实体不会被验证,并且 DB 会抛出错误,因为“电子邮件”字段是必需的。
我是否应该始终将我的实体与要验证的表单相关联?如果是这种情况,我完全不同意,因为如果我正在使用 Web 服务,我不想创建一个表单只是为了在服务器端进行验证。
那么,我怎么能做这个验证呢?谢谢你的帮助。