Bonjour tout le monde!

Je suis depuis plus d'une semaine coincé sur une erreur lors de la soumission du formulaire d'édition de mon entité réalisation.

En effet, j'essaie de créer un site web pour mon propre compte et j'ai deux entité Realisation et Image qui ont une relation OneToMany. Dans l'entité image, je définis juste le nom de l'image qui sera stockée en bd et dans mon dossier public/uploads/realisation. Seulement, quand je créé une nouvelle réalisation, l'upload se fait sans erreur mais lors de l'edition, j'obtiens le message d'erreur The file could not be found. Je ne comprends pas ce que symfony essaie de me dire par là. J'ai essayé de fouiller la doc mais sans succès.

Mon en entité image `<?php

namespace App\Entity;

use App\Repository\ImageRealisationRepository;
use Doctrine\ORM\Mapping as ORM;

/**

  • @ORM\Entity(repositoryClass=ImageRealisationRepository::class)
    */
    class ImageRealisation
    {
    /**

    • @ORM\Id
    • @ORM\GeneratedValue
    • @ORM\Column(type="integer")
      */
      private $id;

    /**

    • @ORM\Column(type="string", length=255)
      */
      private $name;

    /**

    • @ORM\ManyToOne(targetEntity=Realisation::class, inversedBy="images")
      */
      private $realisation;

    public function getId(): ?int
    {
    return $this->id;
    } Mon entité **Réalisation** <?php

namespace App\Entity;

use App\Repository\RealisationRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use App\Entity\Traits\Timestampable;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Symfony\Component\Validator\Constraints as Assert;

/**

  • @ORM\Entity(repositoryClass=RealisationRepository::class)
  • @ORM\Table(name="realisations")
  • @ORM\HasLifecycleCallbacks
  • @Vich\Uploadable
    */
    class Realisation
    {
    use Timestampable;
    /**

    • @ORM\Id
    • @ORM\GeneratedValue
    • @ORM\Column(type="integer")
      */
      private $id;

    /**

    • @ORM\ManyToOne(targetEntity=User::class, inversedBy="realisations")
      */
      private $author;

    /**

    • @ORM\Column(type="string", length=255)
      */
      private $title;

    /**

    • @ORM\Column(type="string", length=255)
      */
      private $client;

    /**

    • @ORM\Column(type="string", length=255)
      */
      private $location;

    /**

    • @ORM\ManyToMany(targetEntity=RealisationCathegorie::class, inversedBy="realisations")
      */
      private $realisation_cathegorie;

    /**

    • @ORM\OneToMany(targetEntity=ImageRealisation::class, mappedBy="realisation",cascade={"persist"})
      */
      private $images;
      . Mon **controlleur et son action create**#[Route('/admin/realisation/create/',name:'app_admin_realisation_create',methods:['GET','POST'])]
      public function create(Request $request):Response
      {
      $realisation = new Realisation();

      $form = $this->createForm(RealisationType::class,$realisation);

      $form->handleRequest($request);

      if ($form->isSubmitted() && $form->isValid()) {
      // we recover all images who where transmitted
      $images = $form->get('images')->getData();
      // We verify that image(s) has been uploaded
      if ($images) {

          // we buckle on the images
          foreach($images as $image){
              // we generatted a new file name
              $fichier = md5(uniqid()).'.'.$image->guessExtension();
      
              // we copy the file to the folder uploads
              $image->move(
                  $this->getParameter('realisation_images_directory'),
                  $fichier
              );
              // we create the image in database
              $img = new ImageRealisation();
              $img->setName($fichier);
              $realisation->addImage($img);
          }
      
          $realisation->setAuthor($this->userRepo->find(1));
          $this->em->persist($realisation);
          $this->em->flush();
          return $this->redirectToRoute('app_realisation');
      }

      }

      return $this->render('admin/realisation/create.html.twig',['form'=>$form->createView()]);
      } Mon **controlleur et son action edit** #[Route('/admin/realisation/edit-{id<[0-9]+>}/',name:'app_admin_realisation_edit',methods:['GET','PUT'])]

    public function edit(Realisation $realisation,Request $request):Response
    {
    foreach($realisation->getImages()->getValues() as $image)
    {
    $image->setName(
    new File($this->getParameter('realisation_images_directory').'/'.$image->getName())
    );
    }
    $form = $this->createForm(RealisationType::class,$realisation,['method'=>'PUT']);

    $form->handleRequest($request);
    
    if ($form->isSubmitted() && $form->isValid()) {
         // we recover all images who where transmitted
            $images = $form->get('images')->getData();
          // We verify that image(s) has been uploaded
        if ($images) {
    
            // we buckle on the images
            foreach($images as $image){
                // we generatted a new file name
                $fichier = md5(uniqid()).'.'.$image->guessExtension();
    
                // we copy the file to the folder uploads
                $image->move(
                    $this->getParameter('realisation_images_directory'),
                    $fichier
                );
                // we create the image in database
                $img = new ImageRealisation();
                $img->setName($fichier);
                $realisation->addImage($img);
            }
    
            $realisation->setAuthor($this->userRepo->find(1));
            $this->em->persist($realisation);
            $this->em->flush();
            return $this->redirectToRoute('app_realisation');
        }
    }
    
    return $this->render('admin/realisation/edit.html.twig',[
        'form'=>$form->createView(),
        'realisation'=>$realisation
    ]);

    }Mon **Formulaire ** public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder
    ->add('title',null,[
    'attr'=>['placeholder'=>'Le titre de la réalisation'],
    'label'=>false
    ])
    ->add('slug',null,[
    'attr'=>['placeholder'=>'Le slug'],
    'label'=>false
    ])
    ->add('client',null,[
    'attr'=>['placeholder'=>'Le client'],
    'label'=>false
    ])
    ->add('location',null,[
    'attr'=>['placeholder'=>'Localisation'],
    'label'=>false
    ])
    ->add('realisation_cathegorie')
    //we fiel "principalImage" in the form
    ->add('imageFile', VichImageType::class, [
    'label'=> 'image Principale(fichiers JPG,PNG ou JPEG)',
    'required' => false,
    'allow_delete' => true,
    'delete_label' => 'Delete',
    'download_uri' => false,
    'imagine_pattern' => 'square_thumbnail_realisation'
    ])
    // we add the field "images" in the form
    // He is not related we the database (mapped on false)
    ->add('images', FileType::class,[
    'label' => 'autres images de la réalisation(fichiers JPG,PNG ou JPEG)',
    'multiple' => true,
    'mapped' => false,
    'required' => false
    ])
    ->add('content',CKEditorType::class,[
    'label'=>'Le contenu',
    'config_name'=>'main_config'
    ])
    ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
    $resolver->setDefaults([
    'data_class' => Realisation::class,
    ]);
    }
    `

Ce que je veux

Je veux mettre à jour ma réalisation.

Ce que j'obtiens

J'obtient une erreur : File could not be found lorsque j'essaie de faire un update

1 réponse


Bonjour,

c'est vraiment pénible à lire, merci de formater votre code afin de faciliter la lecture.