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

Plugins PHP Discussion :

Erreur lors de l'utilisation du service KnpMenuBundle "The menu "main" is not defined." [2.x]


Sujet :

Plugins PHP

  1. #1
    Membre à l'essai Avatar de selios
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2015
    Messages : 11
    Points : 16
    Points
    16
    Par défaut Erreur lors de l'utilisation du service KnpMenuBundle "The menu "main" is not defined."
    J'ai essayé d'intégrer KnpMenuBundle comme un service tel qu'indiqué dans la doc.

    J'ai simplement copié-collé le code, plus ou moins tel quel :
    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
    <?php
    // AppBundle/Menu/MenuBuilder.php
    
    namespace AppBundle\Menu;
    
    use Knp\Menu\FactoryInterface;
    
    class MenuBuilder
    {
        private $factory;
    
    /**
         * @param FactoryInterface $factory
         *
         * Add any other dependency you need
         */
    public function __construct(FactoryInterface $factory)
        {
            $this->factory = $factory;
    }
    
        public function createMainMenu()
        {
            $menu = $this->factory->createItem('root');
    $menu->addChild('Home', array('route' => 'homepage'));
    return $menu;
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # app/config/services.yml
    app.menu_builder:
        class: AppBundle\Menu\MenuBuilder
        arguments: ["@knp_menu.factory"]
        tags:
    - { name: knp_menu.menu_builder, method: createMainMenu, alias: main } # The alias is what is used to retrieve the menu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # app/config/config.yml
    
    imports:
    - { resource: parameters.yml }
        - { resource: security.yml }
        - { resource: services.yml }
    
    [...]
    
    knp_menu:
        twig:
            template: knp_menu.html.twig
        templating: false
        default_renderer: twig
    Et j'appelle le service dans mon template comme indiqué, avec l'alias "main" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {% extends 'logged.html.twig' %}
    
    {% block body %}
    {{ knp_menu_render('main') }}
        <div id="bienvenue">
            <h3>Bonjour, {{ user.nom }} {{ user.prénom }}</h3>
        </div>
    {% endblock %}
    Symfony me renvoie une erreur :
    An exception has been thrown during the rendering of a template ("The menu "main" is not defined.") in accueil.html.twig at line 6.

    La question a déjà été posée sur StackOverflow et Github, mais aucune des réponses ne m'a aidé.
    Et je n'ai pas trouvé comment débugger le problème.

  2. #2
    Membre à l'essai Avatar de selios
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2015
    Messages : 11
    Points : 16
    Points
    16
    Par défaut
    PS: j'arrive à utiliser le bundle avec la « méthode simple » indiquée dans la doc, c'est à dire sans déclarer le service et en appelant la méthode par son nom complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { knp_menu_render('AppBundle:Builder:mainMenu') }}
    Cette méthode fonctionne, mais telle qu'elle est décrite dans la doc, elle implique de récupérer le conteneur de services, ce qui à ma connaissance est contre les bonnes pratiques.

    Le problème n'apparaît que lorsque j'essaie de passer par un service, comme si la déclaration du service ne marchait pas.
    Pourtant, dans le retour de la commande php app/console debug:container, je vois bien mon service app.menu_builder.

    J'ai un doute sur l'alias main, cependant. Ne devrait-il pas apparaître dans la liste?

  3. #3
    Membre à l'essai Avatar de selios
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2015
    Messages : 11
    Points : 16
    Points
    16
    Par défaut
    Ok, j'ai refait un test et ça marche.

    J'avais très bêtement oublié un bout de la configuration des services.
    Il faut que chaque menu soit défini comme service pour pouvoir les appeler avec leur alias.
    Genre comme ç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
    # Générateur de menus
    app.menu_builder:
            class: AppBundle\Menu\Builder
            arguments: ["@knp_menu.factory"]
    
        # Menu principal
    app.main_menu:
            class: Knp\Menu\MenuItem
            factory: ["@app.menu_builder", mainMenu]
            tags:
    - { name: knp_menu.menu, alias: main}
    
        # Menu d'accès au CRUD générique pour toutes les entités.
    app.entity_menu:
            class: Knp\Menu\MenuItem
            factory: ["@app.menu_builder", entityMenu]
            arguments: ["@doctrine.orm.entity_manager"]
            tags:
    - { name: knp_menu.menu, alias: entity}
    Et dans le template:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {{ knp_menu_render('main') }}
    
    {% if is_granted('ROLE_ADMIN') %}
        {{ knp_menu_render('entity') }}
    {% endif %}

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

Discussions similaires

  1. Erreur lors du lancement d'un service web
    Par MacReiben dans le forum Services Web
    Réponses: 1
    Dernier message: 26/07/2006, 23h23
  2. Erreur lors de l'utilisation de session_start();
    Par nane1474 dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2006, 12h06
  3. Erreur lors de l' utilisation des objets ADO
    Par aityahia dans le forum Bases de données
    Réponses: 10
    Dernier message: 24/03/2006, 13h46
  4. Eviter les erreurs lors de l'utilisation des compo Tsocket
    Par Coussati dans le forum Composants VCL
    Réponses: 5
    Dernier message: 01/02/2006, 19h14
  5. Erreur lors de l'utilisation de strlwr ?!
    Par MonsieurAk dans le forum C++
    Réponses: 4
    Dernier message: 05/12/2005, 10h22

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