1

我正在使用 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”通过所有验证并且不会产生错误。

我一步一步调试它,当我调试它时,它正确通过,验证正确并返回一切正常。所以我认为是一些验证时间太长,在调试的时候给了它验证的机会,当我让它运行代码的时候,验证失败。

4

0 回答 0