我希望你能幫助我,因為我正在尋找并且我迷路了:(
我正在嘗試使用 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>
任何人都可以解釋發生了什么?:(
uj5u.com熱心網友回復:
假設您使用的是 Php 8 ,請將包配置為使用屬性而不是注釋
vich_uploader:
metadata:
type: attribute
參考檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/456399.html
標籤:php 交响乐 vichuploader 捆绑包
上一篇:教義IF宣告
