2012-07-07 140 views
13

在我的學說實體,這是data_class我的形式我有這樣定義的文件屬性:非空白的文件輸入字段

/** 
    * Image. 
    * 
    * @Assert\NotBlank 
    * @Assert\File 
    * @Assert\Image(minWidth="138", minHeight="96") 
    */ 
    protected $file; 

而且還表示,它與->add('file', 'file')形成類型...

創建實體完美,但問題是當我使用窗體來更新這個實體。它再次請求文件,因爲它有@Assert \ NotBlank。由於我有這種形式的其他領域,我不想在每次更新上重新上傳圖像。

當我刪除@Assert \ NotBlank時,一貫的工作正常,但我希望這個文件字段是強制性的。

有什麼想法?

回答

7

有兩種方法進行這種情況,都依賴於Callback驗證:(Symfony callback

要麼添加boolean命名isUpdate你的實體將不會被保留,並會告訴該操作試圖驗證。該方法在上面的鏈接中完全描述。

解決此問題的另一種方法是直接向您的表單類型添加回調驗證器。同樣,將需要一些isUpdate國旗,但表格類型在此時間內(通過構造函數傳遞):

if ($this->isUpdate == false){ 
    $builder->addValidator(new CallbackValidator(function(FormInterface $form){ 
     if ($form['image_file']->getData() == NULL){ 
      $form->addError(new FormError('You need to specify image file.'));     
     } 
    })); 
} 

也許有以達到所需的驗證simplier的方式,但我來到這兩個幾個月前。

希望這有助於...

+1

謝謝,這給了我的想法,definatelly :)我不明白你爲什麼需要另一個isUpdate布爾值,以及如何設置值?我檢查了'if(null!== $ this-> getId())'。你可以查看我的要點https://gist.github.com/3066507。在Symfony 2.0中,你甚至可以將它傳遞給驗證器https://gist.github.com/3066488。再次感謝。 – umpirsky 2012-07-07 13:42:23

+0

哦,好點。通過比較實體id和null,你可以肯定地說出操作是「添加」還是「更新」。第二個要點是我想的完美解決方案:) – 2012-07-07 13:53:05

+0

是的,他們關閉了ExecutionContext太糟糕了,並且不能從類之外設置屬性路徑https://github.com/symfony/symfony/blob/ac6939441fb61a17184f536391387aca78b10013 /src/Symfony/Component/Validator/ExecutionContext.php – umpirsky 2012-07-07 14:11:44

6

您還可以使用驗證組爲。一個驗證組(可能是默認的)將用於創建,第二個用於更新。

+0

應該是公認的答案IMO – Shady 2016-12-21 01:25:43

+0

我知道這真的很老,但你能否詳細說明一下?我很努力地理解關於這個的文檔,它不是真正的noob友好的。如果你能使其符合v3標準,那將是非常好的 – 2017-02-09 11:45:55