2014-04-29 187 views
2

我問自己有關用戶發送表單時的驗證......我看到了文檔和教程。他們解釋2種方法來有效DATAS:最佳實踐symfony驗證

文檔:

你必須創建文件: /Resources/config/validation.yml

然後加入類似的東西:

Acme\BlogBundle\Entity\Author: 
    properties: 
     name: 
      - NotBlank: ~ 

我在互聯網上看到的教程:

他們直接在實體中添加約束如:

use Symfony\Component\Validator\Constraints as Assert; 
    /** 
    * @var string $title 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    * @Assert\MinLength(10) 
    */ 
    private $title; 

有一個最佳實踐嗎?我應該在validation.yml中還是在我的實體中編寫所有約束?是否有可能面對沒有實體背後的形式?從單獨的文件

效益: 你把所有的約束只有一個文件從實體文件

效益: 你必須與你的形式constaints SQL constaints,你有字段類型。

那麼,我應該使用什麼?或者沒有人關心這件事?

編輯:我沒有找到有關如何在validation.yml添加變量就像任何信息:

Acme\BlogBundle\Entity\Author: 
    constraints: 
     - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: 
fields: [name] 
message: {{ name }} isn't available 

在實體:

@Assert\UniqueEntity(message='{{ name }} isn't available' 

最好的問候,

+0

實際上有第三種方法是直接向您的表單添加驗證。沒有最佳做法。選擇最適合你的方法。 – Cerad

回答

3

我應該在validation.yml或我的實體中寫入所有約束嗎?

你可以,但你不必,更多的是關於個人喜好。就個人而言,我更喜歡來驗證輸入我的形式,像這樣:

$builder->add('contactPerson', 'text', array(
    'label' => 'Contact person', 
    'constraints' => array(
     new NotBlank(array('message' => 'This field can not be empty.')) 
    ), 
    'required' => true, 
)); 

是否有可能面對一個窗體,而不實體後面?

是的,但通常最好使用背後的實體。如果你想離開淘汰落後形式的實體,您剛剛從你的窗體的方法setDefaultOptions刪除此行:

'data_class' => '...' 

提交表格後,您可以通過使用$form->getData()訪問表單數據。

從單獨的文件好處:你把所有約束只有一個文件從實體文件

效果:你有SQL constaints與形式 constaints,你有字段類型。

那麼,我應該使用什麼?或者沒有人關心這件事?

這更多關於個人偏好。就個人而言,我更喜歡在同一時間進行驗證和表格。當我想在表單中對一些字段進行更改時,在其他文件中搜索驗證會花費更多時間。

+0

事實上,它似乎是最好的方式......但Symfony文檔中沒有關於這方面的內容......我想它和平常的驗證器一樣工作。謝謝 –