表单的视图数据应该是 class 的一个实例...但是是一个 (n) 字符串
The form's view data is expected to be an instance of class ... but is a(n) string
我目前收到以下错误:
"The form's view data is expected to be an instance of class Symfony\Component\HttpFoundation\File\File, but is a(n) string. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) string to an instance of Symfony\Component\HttpFoundation\File\File."
SoundController - 上传功能
/**
* @Security("is_granted('IS_AUTHENTICATED_FULLY')")
* @Route("/song/upload", name="upload_song")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function uploadSong(Request $request)
{
$song = new Sound();
$form = $this->createForm(SoundType::class, $song);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$file = $song->getFile();
$user = $this->getUser();
$fileName = $this
->get('app.file_uploader')
->setDir($this->get('kernel')->getRootDir()."/../web".$this->getParameter('songs_directory'))
->upload($file);
$song->setFile($fileName);
$file = $song->getCoverFile();
if ($file === null)
{
$song->setCoverFile($this->getParameter('default_cover'));
}
else
{
$fileName = $this
->get('app.file_uploader')
->setDir($this->get('kernel')->getRootDir()."/../web".$this->getParameter('covers_directory'))
->upload($file);
$song->setCoverFile($fileName);
}
$song->setUploader($user);
$song->setUploaderID($user->getId());
$user->addSong($song);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($song);
$entityManager->flush();
return $this->redirectToRoute('song_view', [
'id' => $song->getId()
]);
}
return $this->render('song/upload.html.twig', [
'form' => $form->createView()
]);
}
声音类型 - 形式
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', FileType::class)
->add('coverFile', FileType::class, [
'required' => false
])
->add('songName', TextType::class)
->add('songAuthor', TextType::class);
}
/**
* @ORM\Column(type="string")
*
* @Assert\NotBlank(message="Please, upload the song as a MP3 file.")
* @Assert\File(mimeTypes={ "audio/mpeg", "audio/wav", "audio/x-wav", "application/octet-stream" })
*/
private $file;
你告诉 doctrine 你想要存储一个字符串,但是你在表单中呈现了一个上传按钮,它向你发送了一个你根本不想存储在数据库中的物理文件。相反,您想将文件从临时目录移动到上传目录,并且您想记住文件的 名称 到数据库中,因此您需要这个 属性 这是一个字符串。
最好的方法是遵循这个 page
答案如下:
{
$builder
->add('file', FileType::class, array('data_class' => null))
->add('coverFile', FileType::class, array('data_class' => null))
->add('coverFile', FileType::class, array('data_class' => null,'required' => false))
->add('songName', TextType::class)
->add('songAuthor', TextType::class);
}
我目前收到以下错误:
"The form's view data is expected to be an instance of class Symfony\Component\HttpFoundation\File\File, but is a(n) string. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) string to an instance of Symfony\Component\HttpFoundation\File\File."
SoundController - 上传功能
/**
* @Security("is_granted('IS_AUTHENTICATED_FULLY')")
* @Route("/song/upload", name="upload_song")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function uploadSong(Request $request)
{
$song = new Sound();
$form = $this->createForm(SoundType::class, $song);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$file = $song->getFile();
$user = $this->getUser();
$fileName = $this
->get('app.file_uploader')
->setDir($this->get('kernel')->getRootDir()."/../web".$this->getParameter('songs_directory'))
->upload($file);
$song->setFile($fileName);
$file = $song->getCoverFile();
if ($file === null)
{
$song->setCoverFile($this->getParameter('default_cover'));
}
else
{
$fileName = $this
->get('app.file_uploader')
->setDir($this->get('kernel')->getRootDir()."/../web".$this->getParameter('covers_directory'))
->upload($file);
$song->setCoverFile($fileName);
}
$song->setUploader($user);
$song->setUploaderID($user->getId());
$user->addSong($song);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($song);
$entityManager->flush();
return $this->redirectToRoute('song_view', [
'id' => $song->getId()
]);
}
return $this->render('song/upload.html.twig', [
'form' => $form->createView()
]);
}
声音类型 - 形式
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', FileType::class)
->add('coverFile', FileType::class, [
'required' => false
])
->add('songName', TextType::class)
->add('songAuthor', TextType::class);
}
/**
* @ORM\Column(type="string")
*
* @Assert\NotBlank(message="Please, upload the song as a MP3 file.")
* @Assert\File(mimeTypes={ "audio/mpeg", "audio/wav", "audio/x-wav", "application/octet-stream" })
*/
private $file;
你告诉 doctrine 你想要存储一个字符串,但是你在表单中呈现了一个上传按钮,它向你发送了一个你根本不想存储在数据库中的物理文件。相反,您想将文件从临时目录移动到上传目录,并且您想记住文件的 名称 到数据库中,因此您需要这个 属性 这是一个字符串。
最好的方法是遵循这个 page
答案如下:
{
$builder
->add('file', FileType::class, array('data_class' => null))
->add('coverFile', FileType::class, array('data_class' => null))
->add('coverFile', FileType::class, array('data_class' => null,'required' => false))
->add('songName', TextType::class)
->add('songAuthor', TextType::class);
}