2012-08-23 52 views
1

有人能給我一些關於Symfony2如何使用ORM元數據自動構建驗證規則的啓示嗎?我正在使用Symfony2.1。來自實體映射元數據的驗證規則

例如,如果我們有一個Foo實體與所需name屬性,我們有以下學說metada(如註釋):

@ORM\Column(name="name", type="string", length=255, nullable=false) 

但是,我們有Assert重複nullable信息,如果我們希望它在服務器端進行驗證:

@Assert\NotBlank() 

在另一邊,如果我們有一個number屬性與integer類型,這自動用作驗證規則,而不需要使用任何@Assert註釋。

@ORM\Column(name="number", type="integer", nullable=true) 
//@Assert\Type(type="integer") is no needed 

回答

3

基本上,有兩種不同的層:

存在層使用元數據將驗證規則添加到數據庫。在Doctrine2中,您可以使用註釋,但通過Propel,您可以使用XML描述數據庫。它主要用於定義SQL語句(基本上nullable=false已轉換爲SQL NOT NULL)。

驗證圖層用於在應用程序級驗證您的數據。 Doctrine2元數據用於構建您的數據庫,而驗證層用於驗證數據(例如來自用戶的數據),然後將其插入數據庫中。

您可以使用Validator組件(如業務驗證規則)在應用程序級別添加更多約束。而且,您不應該依賴數據庫來驗證數據。

由於你有兩個不同的層,有兩個不同的問題,你不能混合它們。

+0

感謝您的回答@WilliamDURAND。但事實是,在某些時候,兩層都在混合。正如我所說的,如果ORM設置了一個「整數」約束,那麼驗證層也會使用這個約束。但是,例如,不能使用「可空」約束。 –

+1

您確定它不是表單組件的一部分嗎? Form組件可以根據Doctrine元數據猜測類型,有些類型可以實現驗證(例如HTML5驗證)。 –

+0

我認爲它必須是驗證組件,至少它的工作原理是一樣的。我禁用HTML5驗證,並且服務器顯示有關字段類型的錯誤消息,並且未添加驗證約束。也許Form和Valdation組件在某個點有類似的行爲? :S –