Symfony2表单中的非空白文件输入字段

ump*_*sky 13 forms validation entity symfony doctrine-orm

在我的Doctrine实体中,data_class对于我的表单,我有一个像这样定义的文件属性:

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

另外,将其添加到表单类型中->add('file', 'file')...

创建实体是完美的,但问题是当我使用表单来更新这个实体时.它再次请求文件,因为它有@Assert\NotBlank.由于我在此表单中有其他字段,因此我不想在每次更新时重新上载映像.

当我删除@Assert\NotBlank时,everithing工作正常,但我希望这个文件字段是必需的.

任何的想法?

Jov*_*vic 7

你有两种方法可以解决这种情况并且都依赖Callback验证器:( Symfony回调)

booleannamed命名添加isUpdate到您将不会持久化的实体,并告诉验证器尝试了哪个操作.该方法在上面的链接中完整描述.

解决此问题的另一种方法是直接向Form类型添加Callback验证器.同样,isUpdate需要一些标志,但这次是在Form类型中(通过构造函数传递):

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.'));                  
        }
    }));
}
Run Code Online (Sandbox Code Playgroud)

也许有更简单的方法来实现所需的验证,但我在这两个月前就遇到了这个问题.

希望这可以帮助...


小智 7

您也可以使用验证组.一个验证组(可能是默认组)将用于创建,第二个用于更新.