模型验证Symfony2

问题描述:

我已阅读如何使用sf2验证服务器端的表单。解决方案是使用实体中的约束作为注释,validation.yml或EntityType(Form)。模型验证Symfony2

一切都很好,但是,所有这些验证只适用于窗体。但是,当你实例化一个新对象并试图坚持时,验证不起作用。

我会给你一个例子。

试想一下,我有一个用户实体:

/** 
* @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抛出一个错误。

我是否应该始终将我的实体与表单进行关联来验证?如果是这样的话,我完全不同意,因为如果我使用网络服务,我不想创建一个仅用于在服务器端验证的表单。

那么,我怎么能做这个验证?谢谢你的帮助。

+0

事实上,如果您创建了wevbservice,您也可以使用窗体。序列化和反序列化对于表单来说非常简单。参见FOSRestBundle。 – 2013-05-02 19:06:49

可以使用验证服务

$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; 
+0

谢谢......这真的有效......但你错过了调用LifeCycleEvent ...类似 $ this-> em-> getEventManager() - > addEventListener(array(Events :: prePersist),$ this) ; – user2288043 2013-05-06 20:11:40