Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 3] Undefined method 'getAdverts'.

Sujet résolu
    11 mai 2016 à 15:49:10

    Bonjour, 

    Je suis le MOOC de Symfony 3 et quand je veux afficher la page d'accueil, j'obtiens cette erreur: 

    Undefined method 'getAdverts'. The method name must start with either findBy or findOneBy!

    Je vous joins quelques codes: 

    Entity/AdvertRepository

    <?php
    
    namespace OC\PlatformBundle\Entity;
    
    use Doctrine\ORM\EntityRepository;
    use Doctrine\ORM\Tools\Pagination\Paginator;
    // N'oubliez pas ce use
    use Doctrine\ORM\QueryBuilder;
    use Doctrine\Common\Collections\ArrayCollection;
    
    /**
     * AdvertRepository
     *
     * This class was generated by the Doctrine ORM. Add your own custom
     * repository methods below.
     */
    class AdvertRepository extends EntityRepository
    {
        public function getAdverts($page, $nbPerPage)
        {
            $query = $this->createQueryBuilder('a')
              // Jointure sur l'attribut image
              ->leftJoin('a.image', 'i')
              ->addSelect('i')
              // Jointure sur l'attribut categories
              ->leftJoin('a.categories', 'c')
              ->addSelect('c')
              ->orderBy('a.date', 'DESC')
              ->getQuery()
            ;
            
            $query
              // On définit l'annonce à partir de laquelle commencer la liste
              ->setFirstResult(($page-1) * $nbPerPage)
              // Ainsi que le nombre d'annonces à afficher sur une page
              ->setMaxResults($nbPerPage)
            ;
            
            // Enfin, on retourne l'objet Paginator correspondant à la requête construite
            // (n'oubliez pas le use correspondant en début de fichier)
            return new Paginator($query, true);
         
        }
        
    }

    Advert.php

    <?php
    
    namespace OC\PlatformBundle\Entity;
    
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\ORM\Mapping as ORM;
    use Gedmo\Mapping\Annotation as Gedmo;
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Component\Validator\Context\ExecutionContextInterface; 
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 
    use OC\PlatformBundle\Validator\Antiflood;
    
    
    
    /**
     * @ORM\Entity(repositoryClass="OC\PlatformBundle\Entity\AdvertRepository")
     * @ORM\Entity(repositoryClass="OC\PlatformBundle\Repository\CategoryRepository")
     * @ORM\HaslifecycleCallbacks()
     * @ORM\Table(name="advert")
     * @UniqueEntity(fields="title", message="Une annonce existe déjà avec ce titre.")
     */
    class Advert
    {   
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="date", type="datetime")
         */
        private $date;
    
        /**
         * @ORM\Column(name="updated_at", type="datetime", nullable=true)
         */
        private $updatedAt;
        
        /**
         * @var string
         *
         * @ORM\Column(name="title", type="string", length=255, unique=true)
         * @Assert\Length(min=10)
         */
        private $title;
    
        /**
         * @var string
         *
         * @ORM\Column(name="author", type="string", length=255)
         * @Assert\Length(min=2)
         */
        private $author;
    
        /**
         * @ORM\OneToOne(targetEntity="OC\PlatformBundle\Entity\Image", cascade={"persist", "remove"})
         * @Assert\Valid()
         */
        private $image;
    
        /**
         * @ORM\ManyToMany(targetEntity="OC\PlatformBundle\Entity\Category", cascade={"persist"})
         */
        private $categories;     
            
        /**
         * @var string
         *
         * @ORM\Column(name="content", type="text")
         * @Assert\NotBlank()
         * @Antiflood()
         */
        private $content;
    
        /**
         * @ORM\Column(name="published", type="boolean")
         */
        private $published = true;
    
        /**
         * @ORM\OneToMany(targetEntity="OC\PlatformBundle\Entity\Application", mappedBy="advert")
         */
        private $applications; // Le "s" illustre qu'une annonce est liée à plusieurs candidatures    
    
        /**
         * @ORM\Column(name="nb_applications", type="integer")
         */
        private $nbApplications = 0;
        
        /**
         * @Gedmo\Slug(fields={"title"})
         * @ORM\Column(length=128, unique=true)
         */
        private $slug;
    
    ....
    
    }

    AdvertController.php

    <?php
    
    namespace OC\PlatformBundle\Controller;
    
    use OC\PlatformBundle\Entity\Advert;
    use OC\PlatformBundle\Form\AdvertType;
    use OC\PlatformBundle\Form\AdvertEditType;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
    
    class AdvertController extends Controller
    {
        public function indexAction($page)
        {
                   
          // On a donc accès au conteneur:
          $mailer = $this->container->get('mailer');
          // On ne sait pas combien de pages il y a 
          // Mais on sait qu'une oage doit être supérieure ou égale à 1
          if ($page < 1) {
              // On déclenche une exception NotFoundHttpException, cela va afficher
              // une page d'erreur 404 (qu'on pourra personnaliser plus tard d'ailleurs)
              throw $this->createNotFoundException("La page ".$page." n'existe pas.");
          }
          // Ici, je fix le nombre d'annonces par page à 3
          // Mais bien sûr il faudrait utiliser un paramètre, et y accéder via $this->container->getParameter('nb_per_page')
          $nbPerPage = 3;
          
          // Récupération de notre objet Paginator
          $listAdverts = $this->getDoctrine()
            ->getManager()
            ->getRepository('OCPlatformBundle:Advert')
            ->getAdverts($page, $nbPerPage)
          ;
          
          // On calclue le nombre total de pages grâce au count($listAdverts) qui retourne le nombre total d'annonces
          $nbPages = ceil(count($listAdverts)/$nbPerPage);
          
          // Si la page n'existe pas, on retourne une 404
          if ($page > $nbPages) {
              throw $this->createNotFoundException("La page ".$page." n'existe pas.");
          }
              
          return $this->render('OCPlatformBundle:Advert:index.html.twig', array(
            'listAdverts' =>  $listAdverts,
            'nbPages'     =>  $nbPages,
            'page'        =>  $page
          )); 
            
        }
    
    ....
    
    }  

    J'ai beau chercher, je ne vois pas l'erreur donc si quelqu'un est capable de la déceler, je le remercierais. 





    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2016 à 19:16:53

      //ceci est une erreur :
      
      /**
       * @ORM\Entity(repositoryClass="OC\PlatformBundle\Entity\AdvertRepository")
       * @ORM\Entity(repositoryClass="OC\PlatformBundle\Repository\CategoryRepository")
      
      
      
      // une entité - un repository !!
      • Partager sur Facebook
      • Partager sur Twitter
      READ THE DOCS !
        12 mai 2016 à 0:41:31

        Merci Nico41, l'erreur est corrigée et ça fonctionne. 

        Bonne nuit à tous! 

        • Partager sur Facebook
        • Partager sur Twitter

        [Symfony 3] Undefined method 'getAdverts'.

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown