我已经阅读了如何使用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会抛出错误,因为需要字段“email”。
我是否应始终将我的实体与要验证的表单相关联?如果是这种情况,我完全不同意,因为如果我正在使用Web服务,我不想创建一个表单只是为了在服务器端进行验证。
那么,我怎么能做这个验证呢?谢谢你的帮助。
答案 0 :(得分:1)
您可以使用验证服务
$validator = $this->get('validator');
$validator->validate($user);
请参阅the docs。
顺便提一下,有一种更简洁的方法可以在您的实体中指定验证。
use Symfony\Component\Validator\Constraints as Assert;
class User{
/**
* @Assert\NotNull
*/
protected $username;
/**
* @Assert\NotBlank
* @Assert\Email
*/
protected $email;