VichUploaderBundle に基づいてファイルをアップロードしようとしています。実装時に次のエラーが発生しました。
ContextErrorException: Catchable Fatal Error: Argument 1 passed to Minn\AdsBundle\Entity\MotorsAdsFile::setFile() must be an instance of Symfony\Component\HttpFoundation\File\File, string given,...
問題は、メソッド setFile() で指定された引数のクラスであることを知っています。しかし、これは github のドキュメントで見つけました。
だから、これが私がやったことです。私は問題を解決することを願っています!
バンドルの構成
vich_uploader:
db_driver: orm # or mongodb or propel or phpcr
mappings:
motors_files:
uri_prefix: /files/motors
upload_destination: %kernel.root_dir%/../web/files/motors
namer: vich_uploader.namer_origname
delete_on_remove: true
私のファイルエンティティの定義
<?php
namespace Minn\AdsBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Validator\Constraints as Assert;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
/**
* @ORM\Entity
* @Vich\Uploadable
*/
class MotorsAdsFile {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @Assert\File(
* maxSize="5M",
* mimeTypes={"image/png", "image/jpeg"}
* )
* @Vich\UploadableField(mapping="motors_files", fileNameProperty="file")
* note: This is not a mapped field of entity metadata, just a simple property.
* @var File $file
*/
protected $file;
/**
* @ORM\Column(type="string", length=255, name="name")
* @var string $name
*/
protected $name;
/**
* 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 $file
*/
public function setFile(File $file) {
$this->file = $file;
}
/**
* @return File
*/
public function getFile() {
return $this->file;
}
/**
* @param string $name
*/
public function setName($name) {
$this->name = $name;
}
/**
* @return string
*/
public function getName() {
return $this->name;
}
}
フォームの小枝部分
<form action="{{ path('minn_ads_motors_test6') }}" {{ form_enctype(form) }} method="POST">
{{ form_widget(form) }}
<div>
<input type="submit" value="do it with VICH" />
</div>
</form>
私のコントローラの私のアクション()
public function motorstest6Action(Request $request) {
$document = new MotorsAdsFile();
$form = $this->createFormBuilder($document)
->add('name')
->add('file')
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($document);
$em->flush();
return $this->redirect($this->generateUrl('minn_ads_default_index'));
}
return $this->render('MinnAdsBundle:Motors:adddoc1.html.twig', array(
'form' => $form->createView()));
}