web-dev-qa-db-fra.com

Le nom de la méthode doit commencer par findBy ou findOneBy. Méthode non définie Symfony?

Je travaille dans part4 de Symfony2 , et lors de la mise à jour du code de classe du contrôleur et de l'assistant, j'ai reçu le message d'erreur suivant.

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

avant d’avoir mis du code dans le contrôleur, j’ai basculé dans ma classe d’aide, comme le montre le didacticiel, ce qui entraîne le message d’erreur ci-dessus.

<?php
// src/Blogger/BlogBundle/Repository/BlogRepository.php
namespace Blogger\BlogBundle\Repository;
use Doctrine\ORM\EntityRepository;

/**
 * BlogRepository
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
*/
class BlogRepository extends EntityRepository
{
 public function getLatestBlogs($limit = null)
 {
    $qb = $this->createQueryBuilder('b')
               ->select('b')
               ->addOrderBy('b.created', 'DESC');

    if (false === is_null($limit))
        $qb->setMaxResults($limit);

    return $qb->getQuery()
              ->getResult();
  } 
}

Et voici mon code d'action de fichier de contrôleur: -

// src/Blogger/BlogBundle/Controller/PageController.php
class PageController extends Controller
{
  public function indexAction()
  {
    $em = $this->getDoctrine()
               ->getEntityManager();

    $blogs = $em->getRepository('BloggerBlogBundle:Blog')
                ->getLatestBlogs();

    return $this->render('BloggerBlogBundle:Page:index.html.twig', array(
        'blogs' => $blogs
    ));
    }

    // ..
}

J'attache quelques lignes du fichier /Entity/Blog.php. S'il vous plaît voir si elles sont correctes selon votre réponse.

<?php
// src/Blogger/BlogBundle/Entity/Blog.php

namespace Blogger\BlogBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
 * @ORM\Table(name="blog")
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Entity
 */

class Blog
 {
  /**
   * @ORM\Id
   * @ORM\Column(type="integer")
   * @ORM\GeneratedValue(strategy="AUTO")
   * @ORM\HasLifecycleCallbacks()
  */
  protected $id;
  --
  --
 }

Où est-ce que je me trompe?

53
ScoRpion

Assurez-vous d'avoir modifié votre classe d'entité:

// src/Blogger/BlogBundle/Entity/Blog.php
/**
 * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
 * @ORM\Table(name="blog")
 * @ORM\HasLifecycleCallbacks()
 */
class Blog
{
    // ..
}

l'annotation @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository") est requise.  

Et n'oubliez pas de régénérer des entités:

php app/console doctrine:generate:entities Blogger

METTRE À JOUR

Supprimer l'annotation @ORM\Entity. Il annule la bonne annotation @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")

124
Molecular Man

Dans mon cas, l'ajout d'une annotation appropriée était insuffisant. 
Supprimer le cache de doctrine par php app/console doctrine:cache:clear-metadata n'a pas non plus fonctionné.

Je génère mes entités à partir de la base de données à l'aide de commandes 

app/console php doctrine: mapping: import --force AcmeBlogBundle xml
application php/console doctrine: mapping: convertir une annotation ./src
doctrine php app/console: générer: entités AcmeBlogBundle

Première commande générer le fichier orm.xml pour chaque table de base de données de mon projet . Après la suppression de tous les fichiers orm.xml, les annotations démarrées fonctionnent correctement.

9
user4011534

Si vous utilisez yml comme fichiers de configuration pour vos entités, essayez d’ajouter ceci:

Blogger\BlogBundle\Entity\Blog:
    type: entity
    table: Blog
    repositoryClass: Blogger\BlogBundle\Repository\BlogRepository
    ...

et puis comme mentionné ci-dessus:

php app/console doctrine:generate:entities Blogger
4
s1x

L’autre solution consiste à supprimer tous les fichiers orm.xml ajoutés par les entités générées. Si vous déplacez le dossier ou supprimez, votre mappage avec le référentiel sera opérationnel.

2
Benjamin Petit

Si vous utilisez PHP-FPM, le problème peut persister même après que vous ayez essayé toutes les solutions ci-dessus, utilisez ensuite Sudo service php5-fpm restart, qui a fait l'affaire pour moi.

1
HBK
 * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")

Essayez de placer la classe de référentiel dans le même répertoire à côté de la classe d'entité:

     * @ORM\Entity(repositoryClass="Blogger\BlogBundle\BlogRepository")
0
K-Alex

Dans Symfony 3, il manque probablement la classe de référentiel dans votre fichier orm.xml.

repository-class="Bundle\Repository\MyRepository"

Exemple:

<doctrine-mapping>
    <entity name="Bundle\Entity\MyEntity"
            table="tablename"
            repository-class="Bundle\Repository\MyRepository">
        <id name="id" type="integer" column="id">
            <generator strategy="AUTO"/>
        </id>
    </entity>
</doctrine-mapping>
0
tobias47n9e

Pour moi, cela a aidé à redémarrer ma vm (Vagrant Box)

0
Heisoka