1

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

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

4

1 回答 1

1

您可以使用验证服务

$validator = $this->get('validator');
$validator->validate($user);

请参阅有关此的文档


顺便说一句,有一种更简洁的方法可以在您的实体中指定验证。

use Symfony\Component\Validator\Constraints as Assert;

class User{

/**
 * @Assert\NotNull
 */
protected $username;

/**
 * @Assert\NotBlank
 * @Assert\Email
 */
protected $email;
于 2013-05-02T21:01:02.870 回答