IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

symfony 4 formulaire [4.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut symfony 4 formulaire
    Bonjour,

    J'ai deux soucis concernant un formulaire,

    PB 2: L'un de mes problèmes concerne les champs files

    PB 1: et l'autre concerne un champ liste dans lequel je mets des couleurs (enregistré en bdd) , voici une partie du code de mon formBuilder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
           ->add('joindreDemandeTravaux', FileType::class, array('data_class' => null,'required' => false))
                ->add('joindreImage', FileType::class, array('data_class' => null,'required' => false))
     
                ->add('autreCouleurPrecisez', entityType::Class, [
                        'class' => Couleur::class,
                        'choice_label' => 'nomCouleur',
                        'multiple' => 'false',
                    ])
    En fait pour le champ "autreCouleurPrecisez" , j'ai bien l'affichage de mes couleurs dans mon formulaire mais en revanche quand je fais appel pour regarder ce qu'il a stocké en bdd j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AutreCouleurPrecisez	Doctrine\Common\Collections\ArrayCollection@000000000cea648b0000000035781c2c
    En fait je récupère l'adresse de la collection...
    Sauf que je m'en tape un peu j'aimerais avoir ma couleur sélectionnée


    PB 2 : Champ files

    Lorsque je clique sur mon champ files j'ai l'explorer qui s'ouvre jusque là tout va bien, ensuite je sélectionne un fichier, je n'ai pas le chemin qui s'affiche dans le champ comme ça javais rien sélectionné. Pourtant le fichier est bien sélectionné car à l'enregistrement le fichier tmp est stocké en bdd. Comment je peux avoir le chemin qui s'affiche dans mon champ files à la sélection du fichier ?

  2. #2
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Re, l'ami,

    il n'y a que toi sur le forum symfony ? lol enfin :

    Pour l'upload de fichier j'ai fait ça dans mon controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    /**
         * @Route("/member/newCommande", name="commande_new", methods={"GET","POST"})
         * @param Request $request
         * @param FileUploader $fileUploader
         * @return Response
         */
        public function new(Request $request, FileUploader $fileUploader): Response
        {
            $commande = new Commande();
            $form = $this->createForm(CommandeType::class, $commande);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $file_pdf = $commande->getJoindreDemandeTravaux();
                $file_image = $commande->getJoindreImage();
     
                $filenamepdf = $fileUploader->upload($file_pdf);
                $filenameimage = $fileUploader->upload($file_image);
     
                $commande->setJoindreDemandeTravaux($filenamepdf);
                $commande->setJoindreDemandeTravaux($filenameimage);
     
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($commande);
                $entityManager->flush();
     
                return $this->redirectToRoute('mes_commandes_show');
            }
     
            return $this->render('commande/new.html.twig', [
                'commande' => $commande,
                'form' => $form->createView(),
            ]);
        }
    J'ai aussi créé un service upload :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <?php
     
     
    namespace App\Service;
     
     
    use Symfony\Component\HttpFoundation\File\Exception\FileException;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
     
    class FileUploader
    {
        private $targetDirectory;
     
        public function __construct($targetDirectory)
        {
            $this->targetDirectory = $targetDirectory;
        }
     
        public function upload(UploadedFile $file)
        {
            $fileName = md5(uniqid()).'.'.$file->guessExtension();
     
            try {
                $file->move($this->getTargetDirectory(), $fileName);
            } catch (FileException $e) {
                // ... handle exception if something happens during file upload
                $e->getTraceAsString();
            }
     
            return $fileName;
        }
     
        public function getTargetDirectory()
        {
            return $this->targetDirectory;
        }
    }
    Dans mon fichier services.yaml j'ai déclaré un parameters "doc_travaux_pdf" et "App/Service/FileUploader" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    # This file is the entry point to configure your own services.
    # Files in the packages/ subdirectory configure your dependencies.
     
    # Put parameters here that don't need to change on each machine where the app is deployed
    # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
    parameters:
        locale: 'fr'
        doc_travaux_pdf: '%kernel.project_dir%/public/uploads/doc_travaux'
     
    services:
        # default configuration for services in *this* file
        _defaults:
            autowire: true      # Automatically injects dependencies in your services.
            autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
     
        App\Service\FileUploader:
            arguments:
                $targetDirectory: '%doc_travaux_pdf%'
     
        # makes classes in src/ available to be used as services
        # this creates a service per class whose id is the fully-qualified class name
        App\:
            resource: '../src/*'
            exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
     
        # controllers are imported separately to make sure services can be injected
        # as action arguments even if you don't extend any base controller class
        App\Controller\:
            resource: '../src/Controller'
            tags: ['controller.service_arguments']
     
        # add more service definitions when explicit configuration is needed
        # please note that last definitions always *replace* previous ones
    Cela dit j'ai cette erreur que je ne comprends pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cannot resolve argument $fileUploader of "App\Controller\CommandeController::new()": Cannot autowire service "App\Service\FileUploader": argument "$targetDirectory" of method "__construct()" has no type-hint, you should configure its value explicitly.
    D'après l'erreur je comprends qu'il ne pige pas mon argument $fileUploader mais j'ai bien mon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    use App\Service\FileUploader;

    ça fait 2h30 que je galaire... aide moi plz

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    En fait je viens de trouver d'où ça coince c'est le constructeur de mon service FileUploader avec mon argument $targetDirectory mais je ne sais pas pourquoi, ni comment lui affecter une valeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <?php
     
     
    namespace App\Service;
     
     
    use Symfony\Component\HttpFoundation\File\Exception\FileException;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
     
    class FileUploader
    {
        private $targetDirectory;
     
        public function __construct($targetDirectory)
        {
            $this->targetDirectory = $targetDirectory;
        }
     
        public function upload(UploadedFile $file)
        {
            $fileName = md5(uniqid()).'.'.$file->guessExtension();
     
            try {
                $file->move($this->getTargetDirectory(), $fileName);
            } catch (FileException $e) {
                // ... handle exception if something happens during file upload
                $e->getTraceAsString();
            }
     
            return $fileName;
        }
     
        public function getTargetDirectory()
        {
            return $this->targetDirectory;
        }
    }

  5. #5
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    il n'y a pas de $ dans un fichier yaml
    donc il a du mal à le passer au constructeur !

    $targetDirectory

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    oups

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Je reviens après avoir cherché un moment, j'ai enlevé le '$' dans le services.yaml et fait un cache:clear, ça me met toujours cette erreur concernant mon upload de fichier

    Mon fichier services.yaml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    # This file is the entry point to configure your own services.
    # Files in the packages/ subdirectory configure your dependencies.
     
    # Put parameters here that don't need to change on each machine where the app is deployed
    # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
    parameters:
        locale: 'fr'
        doc_travaux_pdf: '%kernel.project_dir%/public/uploads/doc_travaux'
     
    services:
        # default configuration for services in *this* file
        _defaults:
            autowire: true      # Automatically injects dependencies in your services.
            autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
     
        App\Service\FileUploader:
            arguments:
                targetDirectory: '%doc_travaux_pdf%'
     
        # makes classes in src/ available to be used as services
        # this creates a service per class whose id is the fully-qualified class name
        App\:
            resource: '../src/*'
            exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
     
        # controllers are imported separately to make sure services can be injected
        # as action arguments even if you don't extend any base controller class
        App\Controller\:
            resource: '../src/Controller'
            tags: ['controller.service_arguments']
     
        # add more service definitions when explicit configuration is needed
        # please note that last definitions always *replace* previous ones
    Et ma méthode d'appel de formulaire ayant deux champs de type files :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    /**
         * @Route("/member/newCommande", name="commande_new", methods={"GET","POST"})
         * @param Request $request
         * @param FileUploader $fileUploader
         * @return Response
         */
        public function new(Request $request, FileUploader $fileUploader): Response
        {
            $commande = new Commande();
            $form = $this->createForm(CommandeType::class, $commande);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $file_pdf = $commande->getJoindreDemandeTravaux();
                $file_image = $commande->getJoindreImage();
     
                $filenamepdf = $fileUploader->upload($file_pdf);
                $filenameimage = $fileUploader->upload($file_image);
     
                $commande->setJoindreDemandeTravaux($filenamepdf);
                $commande->setJoindreDemandeTravaux($filenameimage);
     
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($commande);
                $entityManager->flush();
     
                return $this->redirectToRoute('mes_commandes_show');
            }
     
            return $this->render('commande/new.html.twig', [
                'commande' => $commande,
                'form' => $form->createView(),
            ]);
        }
    Mon erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Uncaught PHP Exception Symfony\Component\DependencyInjection\Exception\RuntimeException: "Cannot resolve argument $fileUploader of "App\Controller\CommandeController::new()": Cannot autowire service "App\Service\FileUploader": argument "$targetDirectory" of method "__construct()" has no type-hint, you should configure its value explicitly." at C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Derniere version\siteGravureNew\siteGravureNew\vendor\symfony\dependency-injection\Container.php line 427
    La Class de mon service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
     
     
    namespace App\Service;
     
     
    use Symfony\Component\HttpFoundation\File\Exception\FileException;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
     
    class FileUploader
    {
        private $targetDirectory;
     
        public function __construct($targetDirectory)
        {
            $this->targetDirectory = $targetDirectory;
        }
     
        public function upload(UploadedFile $file)
        {
            $fileName = md5(uniqid()).'.'.$file->guessExtension();
     
            try {
                $file->move($this->getTargetDirectory(), $fileName);
            } catch (FileException $e) {
                // ... handle exception if something happens during file upload
                $e->getTraceAsString();
            }
     
            return $fileName;
        }
     
        public function getTargetDirectory()
        {
            return $this->targetDirectory;
        }
    }

    Tu aurais une idée ? parce que je sèche grave... c'est la première fois que je tente l'histoire ...

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    le message d'erreur indique qu'il faut typer le paramètre passé au constructeur de FileUploader :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <?php
     
     
    namespace App\Service;
     
     
    use Symfony\Component\HttpFoundation\File\Exception\FileException;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
     
    class FileUploader
    {
        private $targetDirectory;
     
        public function __construct( string $targetDirectory)
        {
            $this->targetDirectory = $targetDirectory;
        }
     
        public function upload(UploadedFile $file)
        {
            $fileName = md5(uniqid()).'.'.$file->guessExtension();
     
            try {
                $file->move($this->getTargetDirectory(), $fileName);
            } catch (FileException $e) {
                // ... handle exception if something happens during file upload
                $e->getTraceAsString();
            }
     
            return $fileName;
        }
     
        public function getTargetDirectory()
        {
            return $this->targetDirectory;
        }
    }
    dans services.yaml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    # This file is the entry point to configure your own services.
    # Files in the packages/ subdirectory configure your dependencies.
     
    # Put parameters here that don't need to change on each machine where the app is deployed
    # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
    parameters:
        locale: 'fr'
        doc_travaux_pdf: '%kernel.project_dir%/public/uploads/doc_travaux'
     
    services:
        # default configuration for services in *this* file
        _defaults:
            autowire: true      # Automatically injects dependencies in your services.
            autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
     
     
     
        # makes classes in src/ available to be used as services
        # this creates a service per class whose id is the fully-qualified class name
        App\:
            resource: '../src/*'
            exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
     
        # controllers are imported separately to make sure services can be injected
        # as action arguments even if you don't extend any base controller class
        App\Controller\:
            resource: '../src/Controller'
            tags: ['controller.service_arguments']
     
        # add more service definitions when explicit configuration is needed
        # please note that last definitions always *replace* previous ones
     
       App\Service\FileUploader:
            $targetDirectory: '%doc_travaux_pdf%'
    en SF4 le container injecte automatiquement(autowire: true) les dépendances dont dépend un service à condition de typer ces dépendances. Pour les dépendances de type scalaires c-a-d non objet(int, bool, string), il faut les déclarer dans le container.Pour les dépendances de type object (classe, interface ...) on ne les déclare pas dans le container ils sont automatiquement injectés.

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Merci pour ta réponse rapide :

    j'ai compris ton explication maintenant j'ai une autre erreur en rapport avec l'upload toujours j'ai fait les modifications que tu m'as apporté, mais il est pas content avec le type d'argument, pourtant au niveau de mon form j'ai bien un type file et dans mon identity je passe un string...

    Je ne comprends pas trop là

    Et je pense que je vais devoir faire un peu de javascript car quand je sélectionne un fichier pdf du champ file de mon form je ne vois rien, le champ reste blanc. Donc je ne sais pas le contenu qu'il passe à travers ce champ ...

    je te mets l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Argument 1 passed to App\Service\FileUploader::upload() must be an instance of Symfony\Component\HttpFoundation\File\UploadedFile, string given, called in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Derniere version\siteGravureNew\siteGravureNew\src\Controller\CommandeController.php on line 58

  10. #10
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    à la ligne 58 il a un string au lieu d'un objet

  11. #11
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Re,

    J'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     public function new(Request $request, FileUploader $fileUploader): Response
        {
            $commande = new Commande();
            $form = $this->createForm(CommandeType::class, $commande);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $path_pdf = $commande->getJoindreDemandeTravaux();
                $files_pdf = $_FILES;
                $files_pdf =  $path_pdf;
                $file_image = $commande->getJoindreImage();
     
                $filenamepdf = $fileUploader->upload($files_pdf);
               // $filenameimage = $fileUploader->upload($file_image);
     
                $commande->setJoindreDemandeTravaux($filenamepdf);
              //  $commande->setJoindreDemandeTravaux($filenameimage);
     
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($commande);
                $entityManager->flush();
     
                return $this->redirectToRoute('mes_commandes_show');
            }
     
            return $this->render('commande/new.html.twig', [
                'commande' => $commande,
                'form' => $form->createView(),
            ]);
        }
    Et j'ai ça maintenant comme erreur, pff ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Argument 1 passed to App\Service\FileUploader::upload() must be an instance of Symfony\Component\HttpFoundation\File\UploadedFile, string given, called in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Derniere version\siteGravureNew\siteGravureNew\src\Controller\CommandeController.php on line 60
    Je me suis servis de la documentation : https://symfony.com/doc/current/cont...load_file.html

    Le contrôle sur l'extension de fichier fonctionne mais si je met bien un .pdf j'ai l'erreur donc pas de upload

  12. #12
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    pour l'erreur à la ligne 60, je présume qu'il s'agit de la méthode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                $commande->setJoindreDemandeTravaux($filenamepdf);
    cette méthode prend en paramètre un nom de fichier qui est censé être de type string.Pourquoi l'as-tu typé en UploadedFile?
    ta méthode devrait ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //classe commande
    public function setJoindreDemandeTravaux( string $fichierDevis ): void {
     //...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $commande->setJoindreDemandeTravaux($filenamepdf);
    $commande->setJoindreDemandeTravaux($filenameimage);
    Dans le cas présent tu ne peux pas invoquer 2 fois la même méthode sur la même instance, le dernier appel écrase le 1er et à la fin t'auras qu'un fichier $filenameimage.

  13. #13
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Si je ne défini pas en UploadFile j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Argument 1 passed to App\Service\FileUploader::upload() must be an instance of Symfony\Component\HttpFoundation\File\UploadedFile, string given, called in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Derniere version\siteGravureNew\siteGravureNew\src\Controller\CommandeController.php on line 63

  14. #14
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par linuxien_62 Voir le message
    Si je ne défini pas en UploadFile j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Argument 1 passed to App\Service\FileUploader::upload() must be an instance of Symfony\Component\HttpFoundation\File\UploadedFile, string given, called in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Derniere version\siteGravureNew\siteGravureNew\src\Controller\CommandeController.php on line 63
    On ne voit pas ce que t'as pu apporter comme modifications en retour de ma réponse précédente et qui induit toujours la même erreur. L'erreur indique que la méthode à la ligne 63 attend un paramètre de type UploadedFile or tu lui passes un paramètre de type string. Deux solutions sont possibles(au choix):
    - la 1ère changer le type de paramètre en string(cf.ma précédente intervention)
    - la seconde c'est de dire à la méthode upload ,de la classe FileUploader, de renvoyer le type UploadedFile plutôt que le nom du fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    //FileUploader.php
    //classe FileUploader
     
    public function upload(UploadedFile $file): UploadedFile
        {
            $fileName = md5(uniqid()).'.'.$file->guessExtension();
     
            try {
                $file->move($this->getTargetDirectory(), $fileName);
     
            } catch (FileException $e) {
                $e->getTraceAsString();
            }
     
            return $file;
        }
    PS: surtout n'utilise pas $_FILES pour récupérer le nom du fichier

  15. #15
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Si je remplace par un string je perds l'accès a la méthode guessExtension , je tourne en rond ... ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    class FileUploader
    {
        private $targetDirectory;
     
        public function __construct(string $targetDirectory)
        {
            $this->targetDirectory = $targetDirectory;
        }
     
        public function upload(string $file)
        {
            $fileName = md5(uniqid()).'.'.$file->guessExtension();
     
            try {
                $file->move($this->getTargetDirectory(), $fileName);
            } catch (FileException $e) {
                // ... handle exception if something happens during file upload
                $e->getTraceAsString();
            }
     
            return $fileName;
        }
     
        public function getTargetDirectory()
        {
            return $this->targetDirectory;
        }
    }
    Erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Error
    HTTP 500 Internal Server Error
    Call to a member function guessExtension() on string

  16. #16
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    ce n'était pas dans la classe la FileUploader qu'il fallait modifier le type de paramètre.
    Les modifications apportées à la classe FileUploader
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class FileUploader
    {
        private $targetDirectory;
     
        public function __construct( string $targetDirectory)
        {
            $this->targetDirectory = $targetDirectory;
        }
     
     
     
        /**
         * @param UploadedFile $file
         * @return UploadedFile
         */
        public function upload(UploadedFile $file): UploadedFile
        {
            $fileName = md5(uniqid()).'.'.$file->guessExtension();
     
            try {
                $file->move($this->getTargetDirectory(), $fileName);
     
            } catch (FileException $e) {
                $e->getTraceAsString();
            }
     
            return $file;
        }
     
        public function getTargetDirectory()
        {
            return $this->targetDirectory;
        }
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
        /**
         * @Route("/member/newCommande", name="commande_new", methods={"GET","POST"})
         * @param Request $request
         * @param FileUploader $fileUploader
         * @return Response
         */
        public function new(Request $request, FileUploader $fileUploader): Response
        {
            $commande = new Commande();
            $form = $this->createForm(CommandeType::class, $commande);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $file_pdf = $commande->getJoindreDemandeTravaux();
                $file_image = $commande->getJoindreImage();
     
                $filenamepdf = $fileUploader->upload($file_pdf);
                $filenameimage = $fileUploader->upload($file_image);
     
                $commande->setJoindreDemandeTravaux($filenamepdf);
                $commande->setJoindreDemandeTravaux($filenameimage); // !!! on ne pas peut pas invoquer 2 fois la même méthode sur la même instance
     
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($commande);
                $entityManager->flush();
     
                return $this->redirectToRoute('mes_commandes_show');
            }
     
            return $this->render('commande/new.html.twig', [
                'commande' => $commande,
                'form' => $form->createView(),
            ]);
        }

  17. #17
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Ok,

    J'ai fait ceci et du coup ça fonctionne, merci bcp pour votre aide les amis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
      public function new(Request $request, FileUploader $fileUploader): Response
        {
            $commande = new Commande();
            $form = $this->createForm(CommandeType::class, $commande);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $file = new UploadedFile($commande->getJoindreDemandeTravaux(),"demandeTravaux");
                $fileName = $fileUploader->upload($file);
                $commande->setJoindreDemandeTravaux("$fileName");
     
                $file1 = new UploadedFile($commande->getJoindreImage(), "demandeImage");
                $filename1 = $fileUploader->upload($file1);
                $commande->setJoindreImage("$filename1");
     
                // ... persist the $commande variable or any other work
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($commande);
                $entityManager->flush();
     
                return $this->redirectToRoute('mes_commandes_show');
            }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/05/2017, 17h25
  2. [MySQL] probleme champ formulaire non pris en compte
    Par stefanelle dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/08/2009, 11h53
  3. [CSS]Probleme de formulaire entre IE et Firefox
    Par Steph82 dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 17/02/2005, 18h34
  4. Probleme de formulaire d'upload
    Par Oberown dans le forum ASP
    Réponses: 5
    Dernier message: 26/10/2004, 14h00
  5. [struts] probleme champs dynamiques
    Par rocco dans le forum Struts 1
    Réponses: 28
    Dernier message: 07/06/2004, 21h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo