【问题标题】:Non blank file input field in Symfony2 formSymfony2 表单中的非空白文件输入字段
【发布时间】:2018-08-08 04:30:03
【问题描述】:

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

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

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

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

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

有什么想法吗?

【问题讨论】:

    标签: forms validation symfony doctrine-orm entity


    【解决方案1】:

    您有两种方法可以解决这种情况,并且都依赖于 Callback 验证器:(Symfony callback)

    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.'));                  
            }
        }));
    }
    

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

    希望这会有所帮助...

    【讨论】:

    • 谢谢,这绝对给了我想法 :) 我不明白您为什么需要另一个 isUpdate 布尔值,以及该值是如何设置的?我检查了if (null !== $this->getId())。你可以查看我的要点gist.github.com/3066507。当您可以将上下文传递给验证器gist.github.com/3066488 时,它在 Symfony 2.0 中甚至更漂亮。再次感谢。
    • 哦,好点。通过将实体 id 与 null 进行比较,您可以肯定地说操作是“添加”还是“更新”。我猜第二个要点是完美的解决方案:)
    • 是的,太糟糕了,他们关闭了 ExecutionContext,无法再从类外部设置属性路径github.com/symfony/symfony/blob/…
    【解决方案2】:

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

    【讨论】:

    • 我知道这真的很老,但你能详细说明一下吗?我正在努力理解有关此的文档,它对菜鸟并不友好。如果您可以使其符合 v3 标准,那就太好了
    【解决方案3】:

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

    下面链接中的完整示例动作类

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多