我希望你能帮我,因为我在寻找,我迷路了。
我正在尝试上传图片在我的symfony 6项目与VichUploaderBundle。
但我有个错误:
类"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;
}
}我的FormType:
<?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>谁能解释这是怎么回事?
https://stackoverflow.com/questions/71695459
复制相似问题