我正在使用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;
--
--
}
我在哪里做错了?
答案 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 AcmeBlogBundle xml
php app / console doctrine:mapping:convert annotation ./src
php app / console doctrine:generate:entities AcmeBlogBundle
第一个命令为我项目中的每个数据库表生成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>