模型验证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抛出一个错误。
我是否应该始终将我的实体与表单进行关联来验证?如果是这样的话,我完全不同意,因为如果我使用网络服务,我不想创建一个仅用于在服务器端验证的表单。
那么,我怎么能做这个验证?谢谢你的帮助。
可以使用验证服务
$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;
谢谢......这真的有效......但你错过了调用LifeCycleEvent ...类似 $ this-> em-> getEventManager() - > addEventListener(array(Events :: prePersist),$ this) ; – user2288043 2013-05-06 20:11:40
事实上,如果您创建了wevbservice,您也可以使用窗体。序列化和反序列化对于表单来说非常简单。参见FOSRestBundle。 – 2013-05-02 19:06:49