gpt4 book ai didi

php - Symfony 6 中的 VichUploaderBundle

转载 作者:行者123 更新时间:2023-12-05 00:51:31 26 4
gpt4 key购买 nike

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

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

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

但我有这个错误:

The class "App\Entity\Client" is not uploadable. If you use annotations to configure VichUploaderBundle, you probably just forgot to add @Vich\Uploadable on top of your entity. If you don't use annotations, check that the configuration files are in the right place. In both cases, clearing the cache can also solve the issue.

我的 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 8+,请将包配置为使用 attributes 而不是 annotations

vich_uploader:
metadata:
type: attribute

引用 docs

关于php - Symfony 6 中的 VichUploaderBundle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71695459/

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