【问题标题】:VichUploaderBundle in Symfony 6Symfony 6 中的 VichUploaderBundle
【发布时间】:2022-08-24 15:18:55
【问题描述】:

我希望你能帮助我,因为我正在寻找并且我迷路了:(

我正在尝试使用 VichUploaderBundle 在我的 symfony 6 项目中上传图像。

我使用了文档:https://github.com/dustin10/VichUploaderBundle/blob/master/docs/usage.md#step-1-configure-an-upload-mapping

但我有这个错误:

类 \"App\\Entity\\Client\" 不可上传。如果您使用注释来配置 VichUploaderBundle,您可能只是忘记在您的实体顶部添加@Vich\\Uploadable。如果您不使用注释,请检查配置文件是否在正确的位置。在这两种情况下,清除缓存也可以解决问题。

我的 vich_uploader.yaml :

vich_uploader:
    db_driver: orm


    mappings:
       clients_logo:
           uri_prefix: \'%client_logo%\'
           upload_destination: \'%kernel.project_dir%/public%client_logo%\'
           namer: Vich\\UploaderBundle\\Naming\\SmartUniqueNamer

我的客户实体:

<?php

namespace App\\Entity;

use Doctrine\\ORM\\Mapping as ORM;
use App\\Repository\\ClientRepository;
use Doctrine\\Common\\Collections\\Collection;
use Symfony\\Component\\HttpFoundation\\File\\File;
use Doctrine\\Common\\Collections\\ArrayCollection;
use Vich\\UploaderBundle\\Mapping\\Annotation as Vich;

#[ORM\\Entity(repositoryClass: ClientRepository::class)]
#[Vich\\Uploadable]
class Client
{
    #[ORM\\Id]
    #[ORM\\GeneratedValue]
    #[ORM\\Column(type: \'integer\')]
    private $id;

    #[ORM\\Column(type: \'integer\')]
    private $numero_client;

    /**
    * Some fields
    */

    /**
     * NOTE: This is not a mapped field of entity metadata, just a simple property.
     */
    #[Vich\\UploadableField(mapping: \'clients_logo\', fileNameProperty: \'logo\')]
    private ?File $imageFile = null;

    #[ORM\\Column(type: \'string\', length: 255, nullable: true)]
    private $logo;


    #[ORM\\Column(type: \'datetime\', nullable: true)]
    private ?\\DateTimeInterface $updatedAt = null;

    public function __construct()
    {
        $this->applis = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getLogo(): ?string
    {
        return $this->logo;
    }

    public function setLogo(?string $logo): self
    {
        $this->logo = $logo;

        return $this;
    }

    /**
     * If manually uploading a file (i.e. not using Symfony Form) ensure an instance
     * of \'UploadedFile\' is injected into this setter to trigger the update. If this
     * bundle\'s configuration parameter \'inject_on_load\' is set to \'true\' this setter
     * must be able to accept an instance of \'File\' as the bundle will inject one here
     * during Doctrine hydration.
     *
     * @param File|\\Symfony\\Component\\HttpFoundation\\File\\UploadedFile|null $imageFile
     */
    public function setImageFile(?File $imageFile = null): void
    {
        $this->imageFile = $imageFile;

        if (null !== $imageFile) {
            // It is required that at least one field changes if you are using doctrine
            // otherwise the event listeners won\'t be called and the file is lost
            $this->updatedAt = new \\DateTimeImmutable();
        }
    }

    public function getImageFile(): ?File
    {
        return $this->imageFile;
    }

    public function getBddClient(): ?BaseClient
    {
        return $this->bdd_client;
    }

    public function setBddClient(?BaseClient $bdd_client): self
    {
        $this->bdd_client = $bdd_client;

        return $this;
    }

    /**
     * @return Collection<int, Applis>
     */
    public function getApplis(): Collection
    {
        return $this->applis;
    }

    public function addAppli(Applis $appli): self
    {
        if (!$this->applis->contains($appli)) {
            $this->applis[] = $appli;
        }

        return $this;
    }

    public function removeAppli(Applis $appli): self
    {
        $this->applis->removeElement($appli);

        return $this;
    }

    public function getUpdateAt(): ?\\DateTimeInterface
    {
        return $this->updatedAt;
    }

    public function setUpdateAt(): self
    {
        $this->updatedAt = new \\DateTimeImmutable();

        return $this;
    }
}

我的表单类型:

<?php

namespace App\\Form;

use App\\Entity\\Client;
use Symfony\\Component\\Form\\AbstractType;
use Symfony\\Component\\Form\\CallbackTransformer;
use Symfony\\Component\\Form\\FormBuilderInterface;
use Vich\\UploaderBundle\\Form\\Type\\VichImageType;
use Symfony\\Component\\Validator\\Constraints\\File;
use Symfony\\Component\\OptionsResolver\\OptionsResolver;
use Symfony\\Component\\Form\\Extension\\Core\\Type\\DateType;
use Symfony\\Component\\Form\\Extension\\Core\\Type\\FileType;
use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType;
use Symfony\\Component\\Form\\Extension\\Core\\Type\\EmailType;
use Symfony\\Component\\Form\\Extension\\Core\\Type\\ChoiceType;

class ClientType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add(\'nom\', TextType::class, [
                \'label\' => false,
            ])
            //Some add fields
            ->add(\'imageFile\', VichImageType::class, [
                \'required\' => false
            ]);

        //Indispensable pour faire fonctionner le select du formulaire sinon erreur 500
        $builder->get(\'type_contrat\')
            ->addModelTransformer(new CallbackTransformer(
                function ($typeContratArray) {
                    // transform the array to a string
                    return count($typeContratArray) ? $typeContratArray[0] : null;
                },
                function ($typeContratString) {
                    // transform the string back to an array
                    return [$typeContratString];
                }
            ));
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            \'data_class\' => Client::class,
        ]);
    }
}

在我的表格中:

<div class=\"col-md-6\">
    {{ form_row(form.imageFile, { 
        label: \'Logo\',
        \'attr\': {\'class\': \'form-control\'}
    }) }}
</div>

任何人都可以解释发生了什么? :(

    标签: php symfony vichuploaderbundle


    【解决方案1】:

    假设您使用的是 PHP 8+,请配置要使用的捆绑包属性代替注释

    vich_uploader:
        metadata:
            type: attribute
    

    参考docs

    【讨论】:

    • 哦,伙计,非常感谢!现在好了!我太累了,我没有在文档中看到这一行?
    【解决方案2】:

    谢谢 !这很有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多