Symfony 5 : Uploader une image

hikaru-59
Invité n'ayant pas de compte PHPfrance

15 mars 2022, 22:31

Bonjour,

J'ai un message d'erreur sur la page create_movie :

Cannot autowire argument $file of "App\Controller\MovieController::create()": it references class "Symfony\Component\HttpFoundation\File\UploadedFile" but no such service exists.

Le Controller :

Code : Tout sélectionner

use App\Entity\Movie; use App\Repository\MovieRepository; use App\Form\MovieType; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\String\Slugger\SluggerInterface; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class MovieController extends AbstractController { private $repo; private $em; private $slugger; public function __construct(MovieRepository $repo, EntityManagerInterface $em, SluggerInterface $slugger) { $this->repo = $repo; $this->em = $em; $this->slugger = $slugger; } /** * @Route("/movie/new", name="movie_create") */ public function create(Movie $movie = null, Request $request, UploadedFile $file) { $movie = new Movie(); $form = $this->createForm(MovieType::class, $movie); $form->handleRequest($request); if ($form->isSubmitted() and $form->isValid()) { // ----- Upload Image ----- $originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); $safeFilename = $this->slugger->slug($originalFilename); $filename = $safeFilename.'-'.uniqid().'.'.$file->guessExtension(); $file->move( './assets/img/', $filename ); $movie->setCover( $filename ); // ----- ----- $this->em->persist($movie); $this->em->flush(); return $this->redirectToRoute('movie_show', ['id' => $movie->getId()]); } return $this->render('movie/create.html.twig', [ 'formMovie' => $form->createView() ]); } }
Le fichier Form MovieType :

Code : Tout sélectionner

namespace App\Form; use App\Entity\Movie; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Form\Extension\Core\Type\FileType; class MovieType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('title') ->add('slug') ->add('description') ->add('videoLink') ->add('cover', FileType::class) ->add('releasedAt') ->add('categoryId') ; } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => Movie::class, ]); } }

hikaru-59
Invité n'ayant pas de compte PHPfrance

20 mars 2022, 16:19

J'ai oublié cette ligne :

Code : Tout sélectionner

$file = $form->get('cover')->getData();
J'ai maintenant un autre message d'erreur :

[Semantical Error] The annotation "@Symfony\Component\Validator\Constraints\Image" in property App\Entity\Movie::$cover was never imported. Did you maybe forget to add a "use" statement for this annotation?

Voici mon fichier Entity\Movie :

Code : Tout sélectionner

namespace App\Entity; use App\Repository\MovieRepository; use Symfony\Component\Validator\Constraints as Assert; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass=MovieRepository::class) */ class Movie { /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string", length=255) */ private $title; /** * @ORM\Column(type="string", length=255) */ private $slug; /** * @ORM\Column(type="text") */ private $description; /** * @ORM\Column(type="string", length=255) */ private $videoLink; /** * @Assert\Image(maxSize = "4096k") */ private $cover; /** * @ORM\Column(type="date") */ private $releasedAt; /** * @ORM\Column(type="integer") */ private $categoryId;
C'est la ligne

Code : Tout sélectionner

use Symfony\Component\Validator\Constraints as Assert;
qui n'est pas bonne ?

Eléphanteau du PHP | 44 Messages

29 mars 2022, 15:32

Bonjour,
regarde ce lien => lien
L'illogisme n'est que la logique des autres!