Symfony2:找不到存储库类

时间:2014-03-05 08:54:19

标签: php symfony symfony-2.4

今天我陷入了Repository Class Function我遇到了这个错误

未定义的方法'test'。方法名称必须以findBy或findOneBy!

开头

我已经检查了这些解决方案 - Solution 1 Solution 2 Solution 3

我需要添加到配置文件中吗?

这是我的实体类

// src/Foo/NewsBundle/Entity/News.php
namespace Foo\NewsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * News
 * @ORM\Entity(repositoryClass="Foo\NewsBundle\Repository\NewsRepository")
 * @ORM\Table(name="news")
 * @ORM\HasLifecycleCallbacks()
 */
class News
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $title;

这是我的存储库类

// Foo/NewsBundle/Repository/NewsRepository.php

namespace Foo\NewsBundle\Repository;
use Doctrine\ORM\EntityRepository;

Class NewsRepository extends EntityRepository
{
    public function test()
    {
        return "Nisarg";
    }
}

我将这个来自控制器的 test()函数称为

public function indexAction()
    {
//        $news = $this->getDoctrine()
//                ->getRepository('FooNewsBundle:News')
//                ->findAll();
        $em = $this->getDoctrine()
                   ->getManager();

        $news = $em->getRepository('FooNewsBundle:News')->test();

        if (!$news) {
            throw $this->createNotFoundException('No news found');
        }
        $build['news'] = $news;
        return $this->render('FooNewsBundle:Default:news_show_all.html.twig', $build);
    }

8 个答案:

答案 0 :(得分:2)

检查您是否在News orm配置文件中指定了您的存储库类。

必须有类似" repositoryClass:Foo \ NewsBundle \ Repository \ NewsRepository"

别忘了清除缓存!

答案 1 :(得分:1)

我认为存储库类的标准是将它放在实体文件夹的子目录中,并仍然使用相同的实体名称空间。你使用了不同的命名空间,这就是我认为你有错误的原因。

根据食谱,这是实体和定制respistory的定义方式。 link to custom repository class in the cookbook

实体

// src/Acme/StoreBundle/Entity/Product.php
namespace Acme\StoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\ProductRepository")
 */
class Product
{
    //...
}

存储库:

// src/Acme/StoreBundle/Entity/ProductRepository.php
namespace Acme\StoreBundle\Entity;

use Doctrine\ORM\EntityRepository;

class ProductRepository extends EntityRepository
{
    public function findAllOrderedByName()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT p FROM AcmeStoreBundle:Product p ORDER BY p.name ASC'
            )
            ->getResult();
    }
}

答案 2 :(得分:1)

Fedor Petrick是对的!

您应该查找与该实体对应的orm文件。 在我的例子中,我在OfertaBundle \ Entity文件夹中创建了一个名为:OfertaRepository.php的自定义存储库

另一方面,我有一个文件Oferta.orm.xml

在第三行,它说:

  <entity name="OfertaBundle\Entity\Oferta" table="oferta">

但它应该是:

  <entity name="OfertaBundle\Entity\Oferta" table="oferta" repository-class="OfertaBundle\Entity\OfertaRepository">

现在,OfertaRepository.php中的方法效果很好!

答案 3 :(得分:1)

在您的实体中,您没有使用注释,请检查Resources / config / doctrine中是否有news.yml文件

答案 4 :(得分:0)

您的代码在实体和存储库中看起来正确。也许您可以尝试直接拨打getRepository而不使用->getManager

$this->getDoctrine->getRepository('FooNewsBundle:News')->test();

如果您需要特定字段,您应该查看findOneByfindBy的简短符号,在大多数情况下,它更容易,而不是编写自定义类。

http://symfony.com/doc/current/book/doctrine.html

答案 5 :(得分:0)

你在生产吗?也许清除缓存是解决方案:

php app/console cache:clear --env=prod --no-debug

答案 6 :(得分:0)

如果清除缓存不起作用,$em->getRepository('FooNewsBundle:News') instanceOf Foo\NewsBundle\Repository\NewsRepository是真还是假?根据事物的外观,你没有得到正确的存储库?

答案 7 :(得分:-1)

你有生成实体吗?

php app/console doctrine:generate:entities BUNDLENAME

启动此命令,然后重试代码