我已閱讀如何使用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拋出一個錯誤。
我是否應該始終將我的實體與表單進行關聯來驗證?如果是這樣的話,我完全不同意,因爲如果我使用網絡服務,我不想創建一個僅用於在服務器端驗證的表單。
那麼,我怎麼能做這個驗證?謝謝你的幫助。
事實上,如果您創建了wevbservice,您也可以使用窗體。序列化和反序列化對於表單來說非常簡單。參見FOSRestBundle。 – 2013-05-02 19:06:49