web-dev-qa-db-fra.com

Les données de vue du formulaire devraient être une instance de la classe ... mais sont a(n) string

Je reçois actuellement l'erreur suivante:

"Les données de vue du formulaire devraient être une instance de la classe Symfony\Component\HttpFoundation\File\File, mais il s'agit de la chaîne a(n). Vous pouvez éviter cette erreur en définissant la" classe_données " "option pour annuler ou en ajoutant un transformateur de vue qui transforme a(n) chaîne en une instance de Symfony\Component\HttpFoundation\File\File."

SoundController - fonction de téléchargement

 /**
 * @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()
    ]);
}

SoundType - Form

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);
}
10
J.D.

Voici la réponse:

{
      $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);
  }
16
J.D.
/**
 * @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;

Vous dites à doctrine que vous souhaitez stocker une chaîne, mais vous rendez un bouton de téléchargement sous la forme qui vous envoie un fichier physique que vous ne voulez pas du tout stocker dans votre base de données. Au lieu de cela, vous voulez déplacer le fichier d'un répertoire temporaire vers votre répertoire de téléchargement, et vous voulez vous souvenir du nom du fichier dans la base de données, c'est pourquoi vous avez besoin de cette propriété qui est une chaîne.

Le meilleur moyen est de suivre cela page

3
Frank B