2012-07-07 105 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