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 :

Paramètre inexistant dans un listener [4.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut Paramètre inexistant dans un listener
    Bonjour,

    Voici l'erreur que j'obtiens lorsque je tente de démarrer le serveur :

    The service "App\Listeners\ImageListener" has a dependency on a non-existent parameter "path_image".
    . Or, voici ma classe "ImageListener" :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    <?php
     
    namespace AppBundle\Listeners;
     
    use Doctrine\ORM\Event\LifecycleEventArgs;
    use Liip\ImagineBundle\Imagine\Cache\CacheManager;
    use AppBundle\Entity\Image;
    use AppBundle\Services\ImageTransformer;
    use Vich\UploaderBundle\Event\Event;
    use Doctrine\ORM\EntityManagerInterface;
     
    /**
     * ImageListener
     */
    class ImageListener
    {
        private $cacheManager;
        private $path_image;
        private $orm;
     
        public function __construct(CacheManager $cacheManager, EntityManagerInterface $orm, string $path_image)
        {
            $this->cacheManager = $cacheManager;
            $this->path_image = $path_image;
            $this->orm = $orm;
        }
     
        public function onVichUploaderPreInject(Event $args)
        {
            $entity = $args->getObject();
     
            if (!$entity instanceof Image) {
                return;
            }
     
            $image = $entity->getImage();
            $entity->setTmpFile($image);
            $this->orm->flush();
     
        }
     
     
        public function postUpdate(LifecycleEventArgs $args)
        {
            $entity = $args->getEntity();
     
            if (!$entity instanceof Image) {
                return;
            }
            $changeSet = $args->getEntityManager()->getUnitOfWork()->getEntityChangeSet($entity);
     
            if(!array_key_exists("image", $changeSet)){ 
            return;
            }
     
            try {
                $this->cacheManager->remove($this->path_image.'/'.$entity->getTmpFile());
                $this->cacheManager->resolve($this->path_image.'/'.$entity->getImage(), null);
     
            } catch (\Exception $e) {
     
            }
     
        }
     
        public function preRemove(LifecycleEventArgs $args)
        {
            $entity = $args->getEntity();
     
            if (!$entity instanceof Image) {
                return;
            }
     
            $target = $this->path_image.'/'.$entity->getImage();
            try {
                $this->cacheManager->remove($target);
            } catch (\Exception $e) {
     
            }
        }
     
        public function postPersist(LifecycleEventArgs $args)
        {
            $entity = $args->getObject();
     
            if (!$entity instanceof Image) {
                return;
            }
            $file = $this->path_image.'/'.$entity->getImage();
        }
    }
    Quelqu'un aurait une idée?

    Merci d'avance pour votre aide...

  2. #2
    Membre Expert
    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
    Par défaut
    bonsoir,
    tu as crées un service qui prends en paramètre un type string(cf argument binding dans la doc) qui n'est pas pris en charge par l'autorowire( auto-chargement des objets), donc il faut dire au container à quoi correspond le paramètre $path_image et ça se passe dans le 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
     
    parameters:
        # chemin vers le dossier de upload de tes fichiers( tu peux mettre le chemin que tu veux )
        upload_dir: '%kernel.project_dir%/public/upload'
     
    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.
            public: false       # Allows optimizing the container by removing unused services; this also means
                                # fetching services directly from the container via $container->get() won't work.
                                # The best practice is to be explicit about your dependencies anyway.
     
            bind:       #   $path_image de la classe  ImageListener correspond à   '%kernel.project_dir%/public/upload'  
                 $path_image: '%upload_dir'

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut
    Merci beau coup pour ton aide...

    Dans ce fichier, je dois indiquer à quel service ça correspond, je suppose. Comment dois-je donc procéder?

  4. #4
    Membre Expert
    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
    Par défaut
    avec Symfony 4 inutile de déclarer une classe est un service. Grâce à l'option autowire:true toutes les dépendances de tes classes ( CacheManager , EntityManagerInterface hors mis les types scalaires comme string, int ...) sont chargées automatiquement.

    Dans mon message précédent, j'ai juste ajouté 2 lignes: 4 et 16.
    La ligne 4 on déclare juste un paramètre qui définit le chemin vers le dossier de téléchargement. La ligne 4( la plus importante) associe le paramètre $path_image au chemin correspondant à ton dossier de téléchargement

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut
    Merci beaucoup pour ton aide...

    Cependant, j'ai toujours la même erreur, même après avoir configuré le fichier "services.yml" que voici :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    # 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: 'en'
        # chemin vers le dossier de upload de tes fichiers( tu peux mettre le chemin que tu veux )
        upload_dir: '%kernel.project_dir%/public/upload'
     
    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.
            public: false       # Allows optimizing the container by removing unused services; this also means
                                # fetching services directly from the container via $container->get() won't work.
                                # The best practice is to be explicit about your dependencies anyway.
            bind:       #   $path_image de la classe  ImageListener correspond à   '%kernel.project_dir%/public/upload'  
                $path_image: '%upload_dir'
     
     
        # 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\Listeners\ImageListener:
            arguments:
                $path_image: "%path_image%"
            tags:
                - {name: doctrine.event_listener, event: postUpdate}
                - {name: doctrine.event_listener, event: preRemove}
                - {name: doctrine.event_listener, event: postPersist}
                - {name: kernel.event_listener, event: vich_uploader.pre_inject }
     
        App\Twig\TwigExtension:
            arguments:
                $imageDir: "%path_image%"
            tags:
                - {name: twig.extension}

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut
    Bon, j'avance tout doucement, d'erreur en erreur :-)

    J'ai ajouté ceci dans les paramètres :

    Maintenant, j'obtiens une autre erreur :

    Invalid service "App\Listeners\ImageListener": class "App\Listeners\ImageListener" does not exist.
    Or, voici une partie de mon arborescence du projet :

    Nom : Capture.JPG
Affichages : 553
Taille : 11,6 Ko

    Et le début du code de ma classe "ImageListener" :

    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
    <?php
     
    namespace AppBundle\Listeners;
     
    use Doctrine\ORM\Event\LifecycleEventArgs;
    use Liip\ImagineBundle\Imagine\Cache\CacheManager;
    use AppBundle\Entity\Image;
    use AppBundle\Services\ImageTransformer;
    use Vich\UploaderBundle\Event\Event;
    use Doctrine\ORM\EntityManagerInterface;
     
    /**
     * ImageListener
     */
    class ImageListener
    {

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

Discussions similaires

  1. [5.0 XP]Paramètre \tmp dans my.ini
    Par Jean_Benoit dans le forum Requêtes
    Réponses: 4
    Dernier message: 30/01/2006, 13h33
  2. Paramètre FILE* dans une fonction...
    Par James_ dans le forum C
    Réponses: 16
    Dernier message: 19/01/2006, 16h21
  3. Réponses: 6
    Dernier message: 16/11/2005, 13h12
  4. Paramètre Pchar dans une DLL
    Par Writer dans le forum Langage
    Réponses: 4
    Dernier message: 25/08/2005, 01h33
  5. Paramètres possibles dans une vue ms sql server
    Par lutin2003 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 30/03/2005, 19h03

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