方法名称必须以findBy或findOneBy开头。 未定义的方法Symfony?

我正在通过Symfony2的part4 ,并更新控制器和帮助类代码,我得到以下错误信息

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

之前,我已经把一些代码在控制器,我转移到我的助手类的教程教导,导致上述错误信息。

 <?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(); } } 

这里是我的控制器文件索引行动代码: –

 // 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 )); } // .. } 

我从/Entity/Blog.php文件附加几行。 请根据您的答案查看它们是否正确。

 <?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; -- -- } 

我在哪里做错了?

确保你已经修改你的实体类:

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

注解@ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")是必需的。

不要忘记重新生成实体:

 php app/console doctrine:generate:entities Blogger 

UPDATE

删除注释@ORM\Entity 。 它覆盖了正确的注释@ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")

在我的情况下,添加适当的注释是不够的。
通过php app/console doctrine:cache:clear-metadata删除Doctrine Cache php app/console doctrine:cache:clear-metadata也没有工作。

我通过命令从数据库生成我的实体

php app / console doctrine:映射:import –force AcmeBlogBu​​ndle xml
php app / console doctrine:映射:转换注释./src
php app / console doctrine:生成:实体AcmeBlogBu​​ndle

第一个命令为我的项目中的每个数据库表生成orm.xml文件。 删除所有orm.xml文件之后注释开始正常工作。

如果您使用yml作为您的实体的configuration文件尝试添加此:

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

然后如上所述:

 php app/console doctrine:generate:entities Blogger 

另一种解决scheme是删除生成实体添加的所有orm.xml文件。 如果您移动文件夹或删除,您与存储库的映射将是可操作的。

如果你正在使用PHP-FPM,那么即使你已经尝试了所有上述解决scheme,然后使用sudo service php5-fpm restart ,这个问题可能会持续下去。

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

尝试将存储库类放在实体类旁边的相同目录中:

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

对我来说,这有助于重新启动我的vm(Vagrant Box)