gpt4 book ai didi

php - 模型转换器不调用 Symfony3 表单验证以供现场使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:34:26 24 4
gpt4 key购买 nike

编辑:这是一个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;

}

用下面的形式

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

还有下面的模型transformer

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

我可以上传正确的图片,并且表格正确保存在数据库中。

但是,如果我提交了不正确的图像(例如 .txt 文件),表单仍会毫无错误地保存在数据库中

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

This file is not a valid image

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

我正在使用 php7 和 symfony3.3.4

最佳答案

答案其实很傻

原因是我在reverseTransform中忘记了return

/**
* 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;
}

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

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

$form = $this->createForm(AdminPlaceType::class, $place);
$form->handleRequest($request);
}

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

关于php - 模型转换器不调用 Symfony3 表单验证以供现场使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45154851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com