我正在关注Symfony2教程(第4章),但是我无法从自定义存储库中检索getLatestBlogs
方法。
我在Linux Mint上使用Symfony 2.2和Phar。
我自己创建了存储库,但是我很难过。我收到这个错误:
未定义的方法'getLatestBlogs'。方法名称必须以findBy或findOneBy开头! - BadMethodCallException
我搜索过其他类似的问题,但无济于事。 有人能在我的代码中发现错误吗?
其他信息
我的composer.json内容如下:
"require": {
"php": ">=5.3.3",
"symfony/symfony": "2.2.0", ** NOTE : Originally read 2.2.* but I changed and successfully ran a composer update **
"doctrine/orm": ">=2.2.3,<2.4-dev",
"doctrine/doctrine-bundle": "1.2.*",
"twig/extensions": "1.0.*",
"symfony/assetic-bundle": "2.1.*",
"symfony/swiftmailer-bundle": "2.2.*",
"symfony/monolog-bundle": "2.2.*",
"sensio/distribution-bundle": "2.2.*",
"sensio/framework-extra-bundle": "2.2.*",
"sensio/generator-bundle": "2.2.*",
"jms/security-extra-bundle": "1.4.*",
"jms/di-extra-bundle": "1.3.*",
"doctrine/doctrine-fixtures-bundle": "dev-master",
"doctrine/data-fixtures" : "dev-master"
},
我的src/Blogger/BlogBundle/Controller/PageController.php
:
namespace Blogger\BlogBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Blogger\BlogBundle\Entity\Enquiry;
use Blogger\BlogBundle\Form\EnquiryType;
class PageController extends Controller
{
public function indexAction()
{
$em = $this->getDoctrine()
->getManager();
$blogs = $em->getRepository('BloggerBlogBundle:Blog')->getLatestBlogs();
return $this->render('BloggerBlogBundle:Page:index.html.twig', array(
'blogs' => $blogs
));
}
最初的谎言
和我的src/Blogger/BlogBundle/Entity/Blog.php
:
namespace Blogger\BlogBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="blog")
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Blog
{
最后我的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();
}
}
答案 0 :(得分:21)
您可以检查以下内容以解决此问题:
确保注释中的FQCN与存储库文件的类名相匹配,并设置了正确的命名空间。
如果您有此活动或暂时禁用Doctrine缓存,请清除所有元数据缓存。
app/console doctrine:cache:clear-metadata
检查配置中的映射类型是否设置为annotation
。即如果你有yml
,你必须在yml文件中定义repositoryClass
。
答案 1 :(得分:4)
我的问题是生成的xml文件不断覆盖注释。我已经读过注释和其他类型的配置不能在一起,但忘记了我的仍然存在。
确保src / xxxx / xxxBundle / Resources / config / doctrine
中没有实体定义(即SomeEntity.orm.xml)答案 2 :(得分:2)
我的解决方案是更改实体注释的顺序:
/**
* Comments
*
* @ORM\Entity(repositoryClass="CmsBundle\Entity\CommentsRepository")
* @ORM\Table()
* @ORM\Entity
*/
没有用,但是
/**
* Comments
*
* @ORM\Table()
* @ORM\Entity
* @ORM\Entity(repositoryClass="CmsBundle\Entity\CommentsRepository")
*/
确实有效:)
答案 3 :(得分:-1)
尝试将use Blogger\BlogBundle\Entity\Blog;
添加到您的控制器。