2013-05-02 218 views
1

我已閱讀如何使用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

回答

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

謝謝......這真的有效......但你錯過了調用LifeCycleEvent ...類似 $ this-> em-> getEventManager() - > addEventListener(array(Events :: prePersist),$ this) ; – user2288043 2013-05-06 20:11:40