3

今天我卡在存储库类函数中,我收到了这个错误

未定义的方法“测试”。方法名称必须以 findBy 或 findOneBy 开头!

我已经检查了这些解决方案 - 解决方案 1 解决方案 2 解决方案 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);
    }
4

8 回答 8

3

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

必须有类似“repositoryClass:Foo\NewsBundle\Repository\NewsRepository”的东西

并且不要忘记清除缓存!

于 2014-08-08T11:44:23.207 回答
1

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

根据食谱,这是实体和自定义呼吸的定义方式。 链接到食谱中的自定义存储库类

实体

// 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();
    }
}
于 2014-04-09T16:08:49.133 回答
1

费多·佩特里克是对的!

您应该查找与实体对应的 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 中的方法运行良好!

于 2016-03-02T22:01:07.123 回答
1

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

于 2016-03-04T12:14:28.530 回答
0

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

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

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

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

于 2014-03-05T09:06:32.777 回答
0

如果清除缓存不起作用,是$em->getRepository('FooNewsBundle:News') instanceOf Foo\NewsBundle\Repository\NewsRepository真的还是假的?从表面上看,您没有以某种方式获得正确的存储库吗?

于 2014-03-05T09:33:45.257 回答
0

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

php app/console cache:clear --env=prod --no-debug
于 2014-03-05T09:26:57.990 回答
-1

have you generated the entities?

php app/console doctrine:generate:entities BUNDLENAME

launch this command and then retry your code

于 2014-03-05T09:14:00.757 回答