方法名称必须以 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 AcmeBlogBundle xml php 应用程序/控制台原则:映射:转换注释 ./src php 应用程序/控制台原则:generate:entities AcmeBlogBundle
第一个命令为我项目中的每个数据库表生成 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?的主要内容,如果未能解决你的问题,请参考以下文章