Symfony3表单验证未被模型转换器用于字段使用

all*_*mon 5 php symfony symfony-validator

编辑:这是一个带有完整代码的github来重现问题

我有以下实体

class Place
{
    use Traits\HasId;

    /**
     * Used for form.
     *
     * @Assert\Image(
     *     mimeTypes = {"image/png", "image/jpeg"},
     *     minWidth = 50,
     *     maxWidth = 1000,
     *     minHeight = 50,
     *     maxHeight = 1000,
     *     maxSize = "1M"
     * )
     */
    private $imageFile = null;

    /**
     * @ORM\OneToOne(targetEntity="MyImage", orphanRemoval=true, cascade={"persist"})
     */
    protected $image;

}
Run Code Online (Sandbox Code Playgroud)

使用以下表格

class AdminPlaceType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $transformer = new HasImageTransformer();
        $builder->add('imageFile')->addModelTransformer($transformer);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(['data_class' => 'AppBundle\Entity\Place']);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下型号变压器

class HasImageTransformer implements DataTransformerInterface
{   
    public function transform($hasImage)
    {
        return $hasImage;
    }

    /**
     * reverse transforms.
     */
    public function reverseTransform($hasImage)
    {   
        $file = $hasImage->getImageFile();
        $myImage = new MyImage();
        $myImage->setData(file_get_contents($file->getPathName()))
        $myImage->setMimeType($file->getMimeType());

        $hasImage->setImage($myImage);
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以上传正确的图像,并将表单正确保存在数据库中.

但是,如果我提交的图像不正确(例如.txt文件),表单仍会保存在数据库中而不会出现任何错误

但是,如果我addModelTransformer从表单中删除,那么我得到了正确的验证错误

此文件不是有效图像

因为我的变压器没有修改原始imageFile字段,我想知道是什么原因导致了这个问题.

我正在使用php7和symfony3.3.4

all*_*mon 3

答案其实很愚蠢

原因是我忘记了returnreverseTransform

/**
 * reverse transforms.
 */
public function reverseTransform($hasImage)
{   
    $file = $hasImage->getImageFile();
    $myImage = new MyImage();
    $myImage->setData(file_get_contents($file->getPathName()))
    $myImage->setMimeType($file->getMimeType());

    $hasImage->setImage($myImage);
    // this was missing :(
    return $hasImage;
}
Run Code Online (Sandbox Code Playgroud)

这导致表单模型中的整个实体被转换为“空”,但实体本身没有被破坏,因为我仍然在控制器中引用它,因为它是通过标准创建的

  public function createAction(Request $request)
  {   
      $place = new Place();

      $form = $this->createForm(AdminPlaceType::class, $place);
      $form->handleRequest($request);
  }
Run Code Online (Sandbox Code Playgroud)

所以$place包含正确的数据,并且包含它的表单null没有触发验证......