par
hikaru-59 » 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,
]);
}
}
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]
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()
]);
}
}
[/code]
Le fichier Form MovieType :
[code]
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,
]);
}
}
[/code]