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

时间:2012-02-07 07:42:01

标签: symfony

我正在使用part4 of Symfony2,在更新控制器和帮助器类代码时,我收到以下错误消息

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

我在哪里做错了?

8 个答案:

答案 0 :(得分:127)

确保您修改了实体类:

// 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

更新

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

答案 1 :(得分:9)

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

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

  

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文件后,注释开始正常工作。

答案 2 :(得分:4)

如果您使用yaml作为实体的配置文件,请尝试添加:

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

然后如上所述:

php app/console doctrine:generate:entities Blogger

答案 3 :(得分:2)

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

答案 4 :(得分:1)

如果您使用的是PHP-FPM,那么即使在您尝试了上述所有解决方案之后,这个问题仍然存在,然后使用sudo service php5-fpm restart为我做了诀窍。

答案 5 :(得分:0)

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

尝试将存储库类放在Entity类旁边的同一目录中:

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

答案 6 :(得分:0)

对我而言,它有助于重启我的虚拟机(Vagrant Box)

答案 7 :(得分:0)

在Symfony 3中,您可能缺少orm.xml文件中的存储库类。

repository-class="Bundle\Repository\MyRepository"

实施例

<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>