【问题标题】:The method name must start with either findBy or findOneBy. Undefined method Symfony?方法名称必须以 findBy 或 findOneBy 开头。未定义的方法 Symfony?
【发布时间】:2012-02-28 15:56:36
【问题描述】:

我正在处理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;
  --
  --
 }

我哪里做错了?

【问题讨论】:

  • 注释和博客类之间也有一个换行符,应该在下面。
  • 删除 *.orm.xml 文件对我有用。
  • 实际上是因为 Repository 中的 访问修饰符,如果它是私有函数,您应该以 findBy, findOneBy 开头,但作为一种良好做法,您 不应该 b> 公开存储库功能。 我使用 Symfony 4.3

标签: symfony


【解决方案1】:

确保您已修改您的实体类:

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

【讨论】:

  • 感谢您的回复。我已经更新了添加 Entity/Blog.php 代码的问题。但我仍然收到错误
  • @Showket。更新了我的答案。您有两个 @ORM\Entity 注释。最后一个必须删除
  • @MolecularMan:这个解决方案不适用于 Symfony 2.1.4。未生成 BlogRepository 文件。是bug。你有什么建议!
  • @gowri,这可能是一个错误。如果这是唯一的问题,您可以手动创建存储库文件。
【解决方案2】:

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

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

php 应用程序/控制台原则:映射:import --force AcmeBlogBu​​ndle xml
php 应用程序/控制台原则:映射:转换注释 ./src
php 应用程序/控制台原则:generate:entities AcmeBlogBu​​ndle

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

【讨论】:

  • 删除 *.orm.xml 文件成功了!对于从现有结构生成实体的人来说,这一点应该更为人所知。
  • 删除 orm.xml 所有文件完成了这项工作。
【解决方案3】:

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

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

然后如上所述:

php app/console doctrine:generate:entities Blogger

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 这对我有用。我从 MySQL 数据库对我的实体进行了逆向工程。一旦我删除了 orm.xml 文件,我就能够在存储库中运行自定义查询。
    【解决方案5】:

    如果您使用的是 PHP-FPM,那么即使您尝试了上述所有解决方案,然后使用 sudo service php5-fpm restart 这对我来说成功了,这个问题可能仍然存在。

    【讨论】:

      【解决方案6】:
       * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
      

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

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

      【讨论】:

        【解决方案7】:

        对我来说,它有助于重新启动我的虚拟机(Vagrant Box)

        【讨论】:

        • 我非常怀疑这是对这个问题的答案。如果有的话,这应该是一个评论。而且你有足够的声誉来发表评论!
        • @GhostCat 对我有帮助,那为什么不应该是一个答案呢?教义缓存或其他东西存在一些问题,这解决了它。我希望我能对此有所了解,但这解决了我的问题,我正在寻找几个小时......
        • @Heisoka 你能描述一下缓存问题的根源吗?
        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 2015-05-06
          • 1970-01-01
          • 1970-01-01
          • 2014-01-13
          • 2016-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多