Не удается создать пользовательские хранилища

Я следую учебнику Symfony2 (глава 4), но мне трудно получить метод getLatestBlogs из моего настраиваемого репозитория.

Я использую Symfony 2.2 с Phar в Linux Mint.

Я сам создал репозиторий, но я в тупике. Я получаю эту ошибку:

Undefined метод getLatestBlogs. Имя метода должно начинаться с findBy или findOneBy! - BadMethodCallException

У меня есть другие похожие вопросы, но безрезультатно. Может ли кто-нибудь обнаружить ошибку в моем коде?

Дополнительная информация

My 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
{

и, наконец, my 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();
    }

}

Ответ 1

Для решения этой проблемы вы можете проверить следующее:

  • Убедитесь, что ваш FQCN в аннотации соответствует вашему имени класса файла репозитория, и вы установили правильное пространство имен.

  • Очистите весь кеш метаданных, если у вас есть это активное или временно отключенное кэширование Doctrine.

    app/console doctrine:cache:clear-metadata

  • Проверьте, установлен ли ваш тип сопоставления annotation в вашей конфигурации. т.е. если у вас есть yml, вы должны определить свой repositoryClass в файле yml.

Ответ 2

Моя проблема заключалась в том, что сгенерированные файлы xml сохраняли аннотации. Я прочитал, что аннотации и другой тип конфигурации не могут находиться вместе, но забыл, что мой все еще присутствует.

Убедитесь, что у вас нет сущностей (т.е. SomeEntity.orm.xml) в src/xxxx/xxxBundle/Resources/config/doctrine

Ответ 3

Мое решение состояло в том, чтобы изменить порядок аннотаций Entity:

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

не работает, но

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

сделал работу:)

Ответ 4

Попробуйте добавить use Blogger\BlogBundle\Entity\Blog; к вашему контроллеру.