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 :

"Unable to guess how to get a Doctrine instance from the request information for parameter "pageCategory"."


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Journaliste - formateur web
    Inscrit en
    Octobre 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Journaliste - formateur web
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 35
    Points : 37
    Points
    37
    Par défaut "Unable to guess how to get a Doctrine instance from the request information for parameter "pageCategory"."
    Bonjour à tous,

    En tentant d'intégrer le contenu d'une méthode de controller dans un template, j'ai ce message d'erreur : "An exception has been thrown during the rendering of a template ("Unable to guess how to get a Doctrine instance from the request information for parameter "pageCategory".")."

    Dans ma vue page.show, je souhaite afficher un menu reprenant les titres des pages d'une catégorie bien précises.

    Dans mon pageRepository, j'ai créé cette 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
    14
    15
    16
    /**
         * @param PageCategory $pageCategory
         * @return mixed
         */
        public function findPagebyCategory(PageCategory $pageCategory)
        {
            $qb = $this->createQueryBuilder('p');
     
            $qb->where('p.pageCategory = :pageCategory')
                ->setParameter('pageCategory', $pageCategory)
                ->orderBy('p.id', 'ASC');
     
            return $qb
                ->getQuery()
                ->getResult();       
        }
    Dans mon controller, j'ai créé cette 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
        /**
         * @param PageCategory $pageCategory
         * @return Response
         * @Template()
         */
        public function getMenuCategory(PageCategory $pageCategory): Response
        {
            $this->getDoctrine()->getManager();
     
            $listPages = $this->pageRepositoy->findPagebyCategory($pageCategory);
     
            foreach ($listPages as $page){
                $page['slug'];
                $page['title'];
            }
     
            return $this->render('frontEnd/page/menuCategory.html.twig', array(
                'listPages' => $listPages
            ));
     
        }
    J'ai créé une vue menuCategory.html.twig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     {% for page in listPages %}
        <li>
            <a href="{{ path('page.show', {'slug' : page.slug}) }}">{{ page.title }}</a>
        </li>
     {% endfor %}
    Et dans ma vue show, j'ai intégré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div class="col-lg-4">
                    {{ render(controller('App\\Controller\\PageController::getMenuCategory')) }}
    </div>
    Je ne vois pas où j'ai bien pu me tromper pour afficher le contenu de la méthode getMenuCategory().

    Si vous avez une idée, je suis preneuse.

    Merci d'avance

  2. #2
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Points : 2 015
    Points
    2 015
    Billets dans le blog
    1
    Par défaut
    Je n'utilise jamais l'annotation template donc il y a peut-être des subtilités qui m'échappent, mais voilà ce que je note :

    Est-ce normal que tu appelles ton action getMenuCategory() sans passer de catégorie en paramètre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div class="col-lg-4">
                    {{ render(controller('App\\Controller\\PageController::getMenuCategory')) }}
    </div>
    Comment sont liées tes pages et tes catégories ? Tu ne peux pas faire simplement $pageCategory->getPages() avec une relation one to many ?
    Est-il normal qu'il n'y ait pas de clause select dans ta requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function findPagebyCategory(PageCategory $pageCategory)
        {
            $qb = $this->createQueryBuilder('p');
     
            $qb->where('p.pageCategory = :pageCategory')
                ->setParameter('pageCategory', $pageCategory)
                ->orderBy('p.id', 'ASC');
     
            return $qb
                ->getQuery()
                ->getResult();       
        }
    Qu'est-ce que tu fais ici ? Tu n'assignes pas de valeur aux clés "slug" et "title" de ton array.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach ($listPages as $page){
                $page['slug'];
                $page['title'];
            }

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Journaliste - formateur web
    Inscrit en
    Octobre 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Journaliste - formateur web
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Salut @Sodium, merci pour ta réponse.

    Effectivement, j'ai enlevé l'annotation @template() car j'ai un doute.
    Et j'ai supprimé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach ($listPages as $page){
                $page['slug'];
                $page['title'];
            }

    Mon erreur vient de ma fonction findPagebyCategory(PageCategory $pageCategory). Quand je la remplace par findAll(), toutes mes pages apparaissent bien dans un menu.

    Nom : Capture d’écran 2018-12-22 à 19.10.15.png
Affichages : 4790
Taille : 27,6 Ko

    Du coup, j'ai modifié cette méthode dans ma classe PageRepository pour ne faire apparaître que les pages de la catégorie en cours :

    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
       /**
         * @param PageCategory $pageCategory
         * @return \Doctrine\ORM\QueryBuilder|mixed
         */
        public function findPageByCategory(PageCategory $pageCategory)
        {
            $query = $this->createQueryBuilder('p')
                ->select('p')
                ->orderBy('p.id', 'ASC')
                ->leftJoin('p.pageCategory', 'c')
                ->addSelect('c');
     
            $query = $query->add('where', $query->expr()->in('c', ':c'))
                ->setParameter('c', $pageCategory)
                ->getQuery()
                ->getResult();
     
            return $query;
     
        }
    Mais j'ai encore la même erreur.
    Je ne vois pas où j'ai bien pu me tromper dans cette méthode.

    Si tu as une idée, je suis preneuse.
    Merci !
    Images attachées Images attachées  

  4. #4
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Points : 2 015
    Points
    2 015
    Billets dans le blog
    1
    Par défaut
    Je ne voulais pas dire que tu devais supprimer l'annotation template, juste que moi j'ai l'habitude de faire mes binds actions->templates à la main et que je pouvais donc répondre un peu à côté de la plaque

    Je suppose que tu débutes sur Symfony, est-ce que tu as bien compris compris comment fonctionnent les relations ?

    Logiquement, si tes entités page et catégorie sont liées, tu devrais avoir dans ton entité catégorie une méthode getPage() que tu pourras donc appeler dans ton controller ( $pages = $pageCategory->getPages() qui te renverra toutes les pages liées à ta catégorie sans avoir à faire une requête à la main.

    Doctrine est suffisament bien foutu pour que dans la plupart des cas, les méthodes de base des entités et repositories suffisent, le query builder ne sera utilisé que pour des cas spécifiques, ce qui ne semble pas être le cas ici.

    Mais bon, je pense que ton problème vient plutôt du fait que dans ton template, tu appelles ton controller sans lui passer de paramètre alors que la déclaration de la fonction indique qu'elle attend une catégorie.

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Journaliste - formateur web
    Inscrit en
    Octobre 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Journaliste - formateur web
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Ca y est ! j'y suis arrivée ! merci @sodium.
    Il me manquait un paramètre dans la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     {{ render(controller('App\\Controller\\PageController::getMenuCategory',
                        {'pageCategory' : page.pageCategory}
                    )) }}
    Ca fonctionne désormais !

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

Discussions similaires

  1. An exception has been thrown during the rendering of a template
    Par LerikalBless dans le forum Débuter
    Réponses: 13
    Dernier message: 18/01/2016, 15h23
  2. Réponses: 3
    Dernier message: 02/02/2011, 17h48
  3. Réponses: 3
    Dernier message: 17/01/2007, 14h20
  4. Réponses: 2
    Dernier message: 27/09/2005, 17h32

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