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 Try using dependency injection instead.


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut Symfony 4 Try using dependency injection instead.
    Bonjour,
    Dans mon controller j'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public function showAction()
        {
            $user = $this->getUser();
     
            if (!is_object($user) || (!$user instanceof FOSUserInterface && !$user instanceof LDapUserInterface)) {
                throw $this->createAccessDeniedException('This user does not have access to this section.');
            }
     
            return $this->render('bundles/ApplicationSonataUserBundle/Profile/show.html.twig', array(
                'user' => $user,
                'blocks' => $this->container->get('sonata.admin.block.admin_list'),
            ));
        }
    Cependant j'ai cette erreur:
    Service "sonata.admin.block.admin_list" not found: even though it exists in the app's container, the container inside "App\Controller\ProfileFOSUser1Controller" 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", "templating" and "twig" services. Try using dependency injection instead.
    Mon services sonata.admin.block.admin_list est bien présent quand je fais php bin/console debug:container.
    Je vois bien l'erreur, comme quoi je dois faire une injection de dépendances mais je ne vois absolument pas comment faire. Merci de votre aide

  2. #2
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Bonjour,

    Ce matin-même, je viens d'expliquer le principe de l'injection de dépendance dans le second bloc de code de ce message. Pour votre cas, il faudra simplement remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EntityManagerInterface $entityManager
    par la classe que vous retournait le débugueur quand vous exécutiez la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php bin/console debug:container
    Si ce n'est pas clair, je pourrais reproduire l'exemple, mais pour faciliter l'explication, donnez-moi la classe retournée par la commande précédent.

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    Bonjour. Merci de votre retour. Le retour de la commande bin/console debug:container:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sonata.admin.block.admin_list                                                              Sonata\AdminBundle\Block\AdminListBlockService
    J'ai regardé le post dont vous avez mis le lien.
    Voilà ce que j'ai ajouté dans mon conrtoller:
    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
    use Sonata\AdminBundle\Block\AdminListBlockService;
    class ProfileFOSUser1Controller extends AbstractController
    {
        private $blockService;
     
        public function __construct(AdminListBlockService $blockService){
            $this->blockService = $blockService;
        }
        /**
         * @return Response
         * @Route("/",name="_show")
         * @throws AccessDeniedException
         */
        public function showAction()
        {
            $user = $this->getUser();
     
            if (!is_object($user) || (!$user instanceof FOSUserInterface && !$user instanceof LDapUserInterface)) {
                throw $this->createAccessDeniedException('This user does not have access to this section.');
            }
     
            return $this->render('bundles/ApplicationSonataUserBundle/Profile/show.html.twig', array(
                'user' => $user,
                'blocks' => $this->blockService,
            ));
        }
    }
    Est-ce bien cela qu'il fallait faire? Car j'ai une nouvelle erreur:
    Cannot autowire service "App\Controller\ProfileFOSUser1Controller": argument "$blockService" of method "__construct()" references class "Sonata\AdminBundle\Block\AdminListBlockService" but no such service exists. You should maybe alias this class to the existing "sonata.admin.block.admin_list" service.
    Merci d'avance pour votre aide.

  4. #4
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Tout-à-fait !

    C'est bien cela qu'il fallait faire. Comme il s'agit d'un contrôleur, vous pouviez aussi le rajouter comme argument de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        /**
         * @return Response
         * @Route("/",name="_show")
         * @throws AccessDeniedException
         */
        public function showAction(AdminListBlockService $blockService) {
                // ...
                return $this->render('bundles/ApplicationSonataUserBundle/Profile/show.html.twig', array(
                   'user' => $user,
                   'blocks' => $blockService, //$blockService au lieu de $this->blockService
            ));
        }
    Vous avez avancé, mais vous avez désormais un nouveau problème: Déclarer ce service !

    En théorie, cela se fait dans le fichier services.yaml. Ce qui est étonnant, c'est que cela devrait être fait par Sonata, les fichiers de configuration de Sonata devrait avoir déclaré ce service.

    Si vous regardez le code source de ce bloc, il va être difficile de le configurer vous-même dans le services.yaml, même si c'est faisable. Voici le lien vers la documentation pour déclarer le service, mais je pense que vous devriez chercher pourquoi dans cette partie du code, les services de Sonata ne sont pas déclaré. Je ne connais pas assez ce bundle pour vous répondre, il faut dire que sa documentation n'est pas claire. Je l'ai testé puis abandonné pour cette raison.

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    Ce qui est étonnant est que ce service est déjà déclaré il me semble. Dans un des fichiers j'ai:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
    <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
        <services>
            <service id="sonata.admin.block.admin_list" class="Sonata\AdminBundle\Block\AdminListBlockService" public="true">
                <tag name="sonata.block"/>
                <argument type="service" id="twig"/>
                <!-- NEXT_MAJOR: Remove "null" argument -->
                <argument>null</argument>
                <argument type="service" id="sonata.admin.pool"/>
                <argument type="service" id="sonata.admin.global_template_registry"/>
            </service>
        </services>
    </container>
    Cela ne suffit pas?

  6. #6
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    J'ai essayé de re définir le service dans services.yaml:
    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        sonata.admin.block.admin_list:
            class: Sonata\AdminBundle\Block\AdminListBlockService
            arguments:
                - "twig"
                - null
                - sonata.admin.pool
                - sonata.admin.global_template_registry
            tags:
                - { name: sonata.block }
    Mais toujours la même erreur:
    Cannot autowire service "App\Controller\ProfileFOSUser1Controller": argument "$blockService" of method "__construct()" references class "Sonata\AdminBundle\Block\AdminListBlockService" but no such service exists. You should maybe alias this class to the existing "sonata.admin.block.admin_list" service.
    Ce que je ne comprends pas c'est qu'il me dit d'utiliser un alias et quand je l'utilise il me dit de faire une injection de dépendances.

    EDIT:
    J'ai rajouté ceci dans mon services.yaml
    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Sonata\AdminBundle\Block\AdminListBlockService: '@sonata.admin.block.admin_list'
    Et j'ai à présent une nouvelle erreur:
    Argument 3 passed to Sonata\AdminBundle\Block\AdminListBlockService::__construct() must be an instance of Sonata\AdminBundle\Admin\Pool, string given, called in /var/www/intranet/var/cache/dev/ContainerL4Mvk08/getSonata_Admin_Block_AdminListService.php on line 14
    EDIT 2:
    J'ai modifié comme ceci mon services.yaml:
    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        sonata.admin.block.admin_list:
            class: Sonata\AdminBundle\Block\AdminListBlockService
            arguments:
                - "twig"
                - null
                - "@sonata.admin.pool"
                - "@sonata.admin.global_template_registry"
            tags:
                - { name: sonata.block }
    Mais j'ai une nouvelle erreur :
    Call to a member function renderResponse() on null
    A ce niveau dans AdminListBlockService.php:
    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
        public function execute(BlockContextInterface $blockContext, ?Response $response = null)
        {
            $dashboardGroups = $this->pool->getDashboardGroups();
     
            $settings = $blockContext->getSettings();
     
            $visibleGroups = [];
            foreach ($dashboardGroups as $name => $dashboardGroup) {
                if (!$settings['groups'] || \in_array($name, $settings['groups'], true)) {
                    $visibleGroups[] = $dashboardGroup;
                }
            }
     
            return $this->renderPrivateResponse($this->templateRegistry->getTemplate('list_block'), [
                'block' => $blockContext->getBlock(),
                'settings' => $settings,
                'admin_pool' => $this->pool,
                'groups' => $visibleGroups,
            ], $response);
        }
    Je suis totalement perdue

Discussions similaires

  1. Apprendre le composant Dependency Injection du framework PHP Symfony
    Par Community Management dans le forum Symfony
    Réponses: 4
    Dernier message: 14/02/2016, 22h41
  2. [1.x] Dependency Injection dans le modèle
    Par jekif dans le forum Symfony
    Réponses: 2
    Dernier message: 22/02/2012, 11h50
  3. [2.x] [Dependency Injection] Problème
    Par Sikwan dans le forum Symfony
    Réponses: 4
    Dernier message: 29/07/2011, 15h26
  4. dependency injection dao Jpa
    Par allstar dans le forum JPA
    Réponses: 1
    Dernier message: 16/01/2010, 03h12
  5. Réponses: 2
    Dernier message: 20/08/2008, 15h45

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