模型验证Symfony2

时间:2013-05-02 18:59:49

标签: validation symfony model-validation

我已经阅读了如何使用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服务,我不想创建一个表单只是为了在服务器端进行验证。

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

1 个答案:

答案 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;