在我的Doctrine实体中,我的表单为data_class
,我有一个像这样定义的文件属性:
/**
* Image.
*
* @Assert\NotBlank
* @Assert\File
* @Assert\Image(minWidth="138", minHeight="96")
*/
protected $file;
另外,将其添加到包含->add('file', 'file')
...
创建实体是完美的,但问题是当我使用表单来更新此实体时。它再次请求文件,因为它有@Assert \ NotBlank。由于我有这种形式的其他字段,我不想在每次更新时重新上载图像。
当我删除@Assert \ NotBlank时,everithing工作正常,但我希望此文件字段是必需的。
有什么想法吗?
答案 0 :(得分:7)
您有两种方法摆脱这种情况,并且都依赖于Callback
验证器:(Symfony callback)
将名为boolean
的{{1}}添加到您将不会持久化的实体,并告诉验证者尝试了哪些操作。该方法在上面的链接中完整描述。
解决此问题的另一种方法是直接向Form类型添加Callback验证器。同样,需要一些isUpdate
标志,但这次是在Form类型中(通过构造函数传递):
isUpdate
也许有更简单的方法来实现所需的验证,但我在几个月前就遇到了这些问题。
希望这会有所帮助......
答案 1 :(得分:7)
您也可以使用验证组。一个验证组(可能是默认组)将用于创建,第二个用于更新。
答案 2 :(得分:0)
我也遇到过类似情况。 我尝试编辑数据库中具有文件路径的现有记录。 当我编辑记录时,我必须上传新文件,这对用户来说是不舒服的。 在我的解决方案中,我将变量tmp文件用于文件哈希和变量文件名。 我在“动作”编辑类中进行的所有必需操作。
波纹管链接中的完整示例动作类
https://github.com/marekz/php_examples/wiki/Symfony-how-to-edit-attachment-form