10

我正在关注 Symfony2 教程(第 4 章),但我无法getLatestBlogs从我的自定义存储库中检索该方法。

我在 Linux Mint 上使用 Symfony 2.2 和 Phar。

我自己创建了存储库,但我很难过。我收到此错误:

未定义的方法“getLatestBlogs”。方法名称必须以 findBy 或 findOneBy 开头!- 坏方法调用异常

我用谷歌搜索了其他类似的问题,但无济于事。有人能在我的代码中发现错误吗?

附加信息

我的 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

4 回答 4

22

您可以检查以下内容来解决此问题:

  • 确保注释中的 FQCN 与存储库文件的类名匹配,并且您已设置正确的命名空间。

  • 如果您有此活动或暂时禁用 Doctrine 缓存,请清除所有元数据缓存。

    app/console doctrine:cache:clear-metadata

  • 检查您的映射类型是否annotation在您的配置中设置为。即如果你有你必须在 yml 文件yml中定义你的。repositoryClass

于 2013-03-09T20:56:38.293 回答
4

我的问题是生成的 xml 文件不断覆盖注释。我读过注释和其他类型的配置不能一起存在,但忘记了我的仍然存在。

确保在 src/xxxx/xxxBundle/Resources/config/doctrine 中没有实体定义(即 SomeEntity.orm.xml)

于 2014-10-04T13:00:11.240 回答
3

我的解决方案是更改实体注释的顺序:

/**
* Comments
* 
* @ORM\Entity(repositoryClass="CmsBundle\Entity\CommentsRepository")
* @ORM\Table()
* @ORM\Entity    
*/

没用,但是

/**
* Comments
* 
* @ORM\Table()
* @ORM\Entity
* @ORM\Entity(repositoryClass="CmsBundle\Entity\CommentsRepository")
*/

确实有效:)

于 2015-06-03T13:42:31.803 回答
-1

尝试添加use Blogger\BlogBundle\Entity\Blog;到您的控制器。

于 2013-03-09T20:00:47.553 回答