我正在使用 symfony 6,所有内容都已更新。
我创建了一个表单类型,我打算用它接收一个 url 或图像,并在内部将图像转换为一个 url,该 url 将指示它在服务器上的存储位置,或保留给定的 url。这个想法是能够接收一个或另一个(url或文件)并且只将新url作为数据返回。
这是我的代码:
父窗体
class EditProfileForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('imgProfile', ImageType::class, [
'required' => false,
'label' => "Profile Image",
'bucket' => 'tw-user-files',
'key' => $options["key"],
'constraints' => [
new File([
'maxSize' => '7M',
'mimeTypes' => [
'image/*'
],
'mimeTypesMessage' => 'That is not a valid image format',
])
],
'setter' => function (User &$user, string $data, FormInterface $form): void {
$user->setImgProfile($data);
}
])
;
}
}
图像类型
class ImageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$bucketName = $options["bucket"];
$bucket = $this->flySystemS3->getBucket($bucketName);
$constraints = $options["constraints"];
$builder->add('url', UrlType::class, [
'error_bubbling' => false,
'required' => false,
])
->add('file', FileType::class, [
"error_bubbling" => false,
"multiple" => false,
'required' => false,
'attr' => [
'accept' => 'image/*'
],
'constraints' => $constraints
])
->addViewTransformer(new UrlOrFileToImage($bucket, $options["key"]));
}
}
数据转换器
class UrlOrFileToImage implements DataTransformerInterface
{
public function transform($value)
{
return [
"url" => "",
"file" => null
];
}
public function reverseTransform($value)
{
if (!empty($value["url"])) {
return $value;
}
if (!empty($value["file"])) {
return $this->fileToImage($value["file"]);
}
return "#";
}
private function fileToImage(UploadedFile $file): string
{
$fileName = $this->uploadToServer();
return $fileName;
}
}
情况是在验证父表单时出现错误“找不到文件。”,这仅在验证父表单时发生,子表单“ImageType”通过所有验证并且不会产生错误。
我一步一步调试它,当我调试它时,它正确通过,验证正确并返回一切正常。所以我认为是一些验证时间太长,在调试的时候给了它验证的机会,当我让它运行代码的时候,验证失败。