无法使自定义存储库正常工作

时间:2013-03-09 19:03:47

标签: symfony doctrine-orm

我正在关注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();
    }

}

4 个答案:

答案 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;添加到您的控制器。