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

Posted

技术标签:

【中文标题】方法名称必须以 findBy 或 findOneBy 开头。未定义的方法 Symfony?【英文标题】:The method name must start with either findBy or findOneBy. Undefined method 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 【参考方案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>

【讨论】:

以上是关于方法名称必须以 findBy 或 findOneBy 开头。未定义的方法 Symfony?的主要内容,如果未能解决你的问题,请参考以下文章

存储库中的 Symfony DQL 查询

是否真的有必要检查 getBy 或 findBy 方法是否返回真实值?

21 方法命名规则查询

教义 findby 关系

如何使用具有比较标准的 findBy 方法

对寻呼机对象使用学说 findBy/getBy 魔术方法?