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 :

Service non trouvé [4.x]


Sujet :

Symfony PHP

  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 Service non trouvé
    Bonjour,

    Je tente d'utiliser craueformflowbundle pour l'enregistrement d'une annonce via plusieurs formulaires. Pour ce faire, comme l'indique la documentation, j'ai créé un service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    services:
    ...
        roadtrip.createAdvertFlow:
            class: App\Form\CreateAdvertFlow
            parent: craue.form.flow
            public: true
            autowire: true
            autoconfigure: false
    La classe utilisée par le service se trouve bien dans le répertoire indiqué :

    Nom : Capture.JPG
Affichages : 4469
Taille : 11,9 Ko

    Dans mon controller, j'appelle le service de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        /**
         *  @Route("/road_trip/newAdvert", name="road_trip_createAdvert")
         *  @Route("/road_trip/{id}/editAdvert", name="road_trip_editAdvert")
         */
        public function advertForm() {
            $formData = new Advert(); // Your form data class. Has to be an object, won't work properly with an array.
     
            $flow = $this->get('roadtrip.createAdvertFlow'); // must match the flow's service id
    ...
    Or, lorsque je tente d'appeler cette route, j'ai le message d'erreur suivant :

    Service "roadtrip.createAdvertFlow" not found: even though it exists in the app's container, the container inside "App\Controller\RoadTripController" is a smaller service locator that only knows about the "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer", "session" and "twig" services.Try using dependency injection instead.
    J'ai lu la documentation concernant la création des services, mais je ne comprends pas mon erreur.

    Quelq'un aurait une idée?

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 588
    Par défaut
    Salut,

    Simple hypothèse
    https://symfony.com/doc/current/service_container.html
    tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->get('roadtrip.createAdvertFlow');
    je pense qu'il faut utiliser le container
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $this->container->get('logger');
    Si tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php bin/console debug:container
    tu vois ton service?

  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 beaucoup pour ton aide...

    J'avais déjà tenté le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->container->get(''roadtrip.createAdvertFlow');
    , mais j'avais le même message d'erreur.

    J'avais également fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php bin/console debug:container
    et je n'y avais pas retrouvé mon service...

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Il ne faut pas récupérer le conteneur directement dans le controlleur (ou ailleurs), il faut injecter le service dont tu as besoin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function advertForm(App\Form\CreateAdvertFlow $flow)
    {
    //$flow est maintenant disponible ici
    //...
    Par ailleurs, si autowiring est configuré pour tout le contenu de ton conteneur, tu n'as même pas besoin de configurer le service roadtrip.createAdvertFlow, il sera automatiquement ajouté.

  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.

    En modifiant avec un passage de paramètre tel que tu le proposes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        /**
         *  @Route("/road_trip/newAdvert", name="road_trip_createAdvert")
         *  @Route("/road_trip/{id}/editAdvert", name="road_trip_editAdvert")
         */
        public function advertForm(App\Form\CreateAdvertFlow $flow) {
    ...
    j'obtiens alors l'erreur suivante :

    Service "roadtrip.createAdvertFlow" not found: even though it exists in the app's container, the container inside "App\Controller\RoadTripController" is a smaller service locator that only knows about the "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer", "session" and "twig" services.Try using dependency injection instead.
    Par ailleurs, je ne comprends pas comment je dois procéder pour que mon service soit automatiquement configuré car, si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        roadtrip.createAdvertFlow:
            class: App\Form\CreateAdvertFlow
            parent: craue.form.flow
    j'ai cette erreur :

    Attribute "autowire" on service "roadtrip.createAdvertFlow" cannot be inherited from "_defaults" when a "parent" is set. Move your child definitions to a separate file or define this attribute explicitly in C:\cmder\roadtrip\config/services.yaml (which is loaded in resource "C:\cmder\roadtrip\config/services.yaml").

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    S'il y a dans ton services.yaml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    _defaults:
            autowire: true      
            autoconfigure: true
    Supprime totalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    roadtrip.createAdvertFlow:
            class: App\Form\CreateAdvertFlow
            parent: craue.form.flow

  7. #7
    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
    Encore merci...

    Cependant, en supprimant tout à fait le service du fichier services.yaml, j'obtiens à nouveau cette erreur :

    Service "roadtrip.createAdvertFlow" not found: the container inside "App\Controller\RoadTripController" is a smaller service locator that only knows about the "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer", "session" and "twig" services.
    Pour info, voici l'entièreté du contenu de mon 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    # 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_BE'
        photos_directory: '%kernel.project_dir%/public/uploads/photos'
        #Validity advert duration 
        advert_active_duration : '1 year'
        periods_durations : [ "Week-end", "Long week-end", "Semaine" ]
    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: true       # 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.
        # 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

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Fais un cache:clear

    Teste de nouveau.

    Ensuite, que donne:
    bin/console debug:container roadtrip

    bin/console debug:container CreateAdvertFlow

  9. #9
    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
    Encore un grand merci pour ton aide. Voici le résultat des deux commandes :

    Nom : Capture.JPG
Affichages : 4495
Taille : 42,6 Ko

    Nom : Capture2.JPG
Affichages : 4460
Taille : 33,6 Ko

    J'ai retenter le chargement d'une page après avoir vidé le cache, mais ça n'a rien changé.

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Je viens de voir ce bundle et la documentation ne correspond plus à Symfony 4. Tu ne devrais avoir aucune configuration à faire (j'ai fait un test install et tout s'est autoconfiguré).

    Est-ce que tu as sûr qu'aucun autre contrôleur quelque part ne contient la ligne $this->get('roadtrip.createAdvertFlow'); ?

  11. #11
    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
    Je n'ai qu'un seul controller et j'ai vérifié l’occurrence de "createAdvertFlow". Il n'y en a qu'une, au moment de l'appel du service

    Par contre, quelque chose m'étonne : lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function advertForm(App\Form\CreateAdvertFlow $flow) {
    , j'ai l'erreur
    Cannot determine controller argument for "App\Controller\RoadTripController::advertForm()": the $flow argument is type-hinted with the non-existent class or interface: "App\Controller\App\Form\CreateAdvertFlow". Did you forget to add a use statement?
    .

    Par contre, si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    use App\Form\CreateAdvertFlow;
    ...
    public function advertForm(CreateAdvertFlow $flow)
    ...
    c'est

    Service "roadtrip.createAdvertFlow" not found: the container inside "App\Controller\RoadTripController" is a smaller service locator that only knows about the "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer", "session" and "twig" services.
    qui est affiché.

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    La première erreur est normale, ça aurait dû être \App\Form\CreateAdvertFlow;

    Par contre, je ne sais plus quoi dire sur ton erreur. Est-ce que tu as un $this->get('xxxx') dans ton contrôleur?

    Va dans dev et supprime tout le contenu de cache manuellement, puis refais un test. Si ça ne marche pas, je testerai le bundle demain.

  13. #13
    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
    Non, je ne fais pas appel via un $this->get() dans ce controller. La seule chose que j'ai utilisée et qui fonctionnait correctement (mais c'est actuellement commenté), c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $photo->getFile()->move($this->getParameter('photos_directory'), $photo->getName());
    Pour le cache, je dois supprimer tous les répertoires et fichiers que je trouve sous \var\cache\dev ?

  14. #14
    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'ai réussi à avancer avec ce bundle. Apparememnt, il y avait des soucis avec l'évolution de Symfony. Donc, j'ai procédé comme suit :

    - dans "services.yaml", j'ai ajouté ceci :

    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
     
    services:
    ...
        _instanceof:
            Craue\FormFlowBundle\Form\FormFlow:
                calls:
                    -
                        method: setDataManager
                        arguments: [ '@craue.form.flow.data_manager' ]
                    -
                        method: setFormFactory
                        arguments: [ '@form.factory' ]
                    -
                        method: setRequestStack
                        arguments: [ '@request_stack' ]
                    -
                        method: setEventDispatcher
                        arguments: [ '@event_dispatcher' ]
    - au niveau du controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    use App\Form\CreateAdvertFlow;
    ...
        public function advertForm(CreateAdvertFlow $flow) {
    ...
    - au niveau de la fonction function advertForm(CreateAdvertFlow $flow), j'ai supprimé la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $flow = $this->get('createAdvertFlow');
    Je n'ai maintenant plus d'erreur.

    Reste maintenant à poursuivre avec l'utilisation de ce bundle, mais ça s'est une autre histoire

    Encore un grand merci pour ton temps et ton intérêt

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $flow = $this->get('createAdvertFlow');
    Argh c'est la cause de ton erreur!

    Une fois $flow injecté en paramètre, tu n'avais plus besoin de cette ligne, puisque l'injection remplace le recours au conteneur.

  16. #16
    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
    Oui, effectivement. Cependant, pour pouvoir utiliser le bundle en Symfony 4, il faut impérativement avoir la configuration indiquée plus haut dans le fichier services.yaml, sinon d'autres erreurs surviennent.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 26/05/2017, 12h25
  2. Création version client - fichiers non trouvés
    Par Pascal dans le forum WinDev
    Réponses: 7
    Dernier message: 03/12/2004, 11h34
  3. [debutant][Classpath][Linux] Classe non trouvée
    Par oghma777 dans le forum Général Java
    Réponses: 5
    Dernier message: 15/10/2004, 21h26
  4. COleDispatchDriver et Afx.h -> LPCSTR non trouvé
    Par Bayard dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/09/2004, 08h42
  5. [Debutant][Install][VS]erreur sur fichier non trouvé.
    Par silvermoon dans le forum DirectX
    Réponses: 4
    Dernier message: 16/07/2004, 20h59

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