13

在我的 Doctrine 实体中,这是data_class我的表单,我有一个文件属性定义如下:

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

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

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

当我删除@Assert\NotBlank 时,一切正常,但我希望这个文件字段是强制性的。

任何想法?

4

3 回答 3

7

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

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

解决此问题的另一种方法是将回调验证器直接添加到您的表单类型。同样,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.'));                  
        }
    }));
}

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

希望这可以帮助...

于 2012-07-07T09:03:43.457 回答
7

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

于 2013-03-11T11:21:43.267 回答
0

我有过类似的情况。我尝试使用文件路径编辑数据库中的现有记录。当我编辑记录时,我必须上传新文件,这对用户来说不舒服。在我的解决方案中,我使用变量 tmp 文件作为文件哈希和变量文件名。我在动作编辑类中进行的所有需要​​的操作。

波纹管链接中的完整示例动作类

https://github.com/marekz/php_examples/wiki/Symfony-how-to-edit-attachment-form

于 2018-08-07T20:30:03.657 回答