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

Sco*_*ion 57 symfony

我正在通过Symfony2的第4部分,并在更新控制器和帮助程序类代码时,我收到以下错误消息

Undefined method 'getLatestBlogs'. The method name must start with either
findBy or findOneBy!
Run Code Online (Sandbox Code Playgroud)

在我将一些代码放入控制器之前,我按照教程的教导转移到了我的助手类,这导致了上述错误消息.

<?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();
  } 
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器文件索引操作代码: -

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

    // ..
}
Run Code Online (Sandbox Code Playgroud)

我从/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;
  --
  --
 }
Run Code Online (Sandbox Code Playgroud)

我在哪里做错了?

Mol*_*Man 133

确保您已修改实体类:

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

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

并且不要忘记重新生成实体:

php app/console doctrine:generate:entities Blogger
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

  • @Showket.更新了我的回答.你有两个`@ORM\Entity`注释.必须删除最后一个 (3认同)

use*_*534 9

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

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

php app/console doctrine:mapping:import --force AcmeBlogBu​​ndle xml
php app/console doctrine:mapping:convert annotation ./src
php app/console doctrine:generate:entities AcmeBlogBu​​ndle

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