Имя метода должно начинаться либо с findBy, либо с findOneBy. Неопределенный метод Symfony?

46

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

Undefined method 'getLatestBlogs'. The method name must start with either
findBy or findOneBy!

прежде чем я поставил некоторый код в контроллере, который я переместил на мой вспомогательный класс, как описано в учебнике, в результате чего появилось сообщение об ошибке.

<?php
// 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();
  } 
}

И вот мой индекс файла контроллера Код действия: -

// src/Blogger/BlogBundle/Controller/PageController.php
class PageController extends Controller
{
  public function indexAction()
  {
    $em = $this->getDoctrine()
               ->getEntityManager();

    $blogs = $em->getRepository('BloggerBlogBundle:Blog')
                ->getLatestBlogs();

    return $this->render('BloggerBlogBundle:Page:index.html.twig', array(
        'blogs' => $blogs
    ));
    }

    // ..
}

Я прикрепляю несколько строк из файла /Entity/Blog.php. посмотрите, насколько они правильны в соответствии с вашим ответом.

<?php
// src/Blogger/BlogBundle/Entity/Blog.php

namespace Blogger\BlogBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
 * @ORM\Table(name="blog")
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Entity
 */

class Blog
 {
  /**
   * @ORM\Id
   * @ORM\Column(type="integer")
   * @ORM\GeneratedValue(strategy="AUTO")
   * @ORM\HasLifecycleCallbacks()
  */
  protected $id;
  --
  --
 }

Где я делаю неправильно?

  • 3
    У вас также была новая строка между аннотацией и классом блога, она должна быть прямо ниже.
  • 0
    Удаление файлов * .orm.xml работает для меня.
Теги:

8 ответов

107
Лучший ответ

Убедитесь, что вы изменили класс сущности:

// src/Blogger/BlogBundle/Entity/Blog.php
/**
 * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
 * @ORM\Table(name="blog")
 * @ORM\HasLifecycleCallbacks()
 */
class Blog
{
    // ..
}

требуется аннотация @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository").

И не забывайте регенерировать объекты:

php app/console doctrine:generate:entities Blogger

UPDATE

Удалить аннотацию @ORM\Entity. Он отменяет правильную аннотацию @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")

  • 0
    Спасибо за ваш ответ. Я обновил вопрос, где я добавил код Entity / Blog.php. но я все еще получаю ошибку
  • 3
    @Showket. Обновил мой ответ. У вас есть две аннотации @ORM\Entity . Последний должен быть удален
Показать ещё 2 комментария
8

В моем случае добавления правильной аннотации было недостаточно.

Удаление кэша доктрины php app/console doctrine:cache:clear-metadata тоже не сработало.

Я генерирую свои сущности из базы данных командами

php app/console doctrine: mapping: import --force AcmeBlogBundle xml
php app/console doctrine: mapping: преобразование аннотации. /src

Первая команда генерирует файл orm.xml для каждой таблицы БД в моем проекте. После DELETING всех файлов orm.xml Аннотации начали работать правильно.

  • 0
    Удаление файлов * .orm.xml сделало свое дело! Это должно быть больше известно людям, которые создали свои объекты из существующей структуры.
  • 0
    Удаление orm.xml всех файлов сделало свою работу.
3

Если вы используете yml в качестве файлов конфигурации для своих сущностей, попробуйте добавить это:

Blogger\BlogBundle\Entity\Blog:
    type: entity
    table: Blog
    repositoryClass: Blogger\BlogBundle\Repository\BlogRepository
    ...

а затем, как указано выше:

php app/console doctrine:generate:entities Blogger
2

Другое решение - удалить все файлы orm.xml, добавленные сгенерированными объектами. Если вы переместите папку или удалите, ваше сопоставление с репозиторием будет работать.

  • 0
    Это сработало для меня. Я пересмотрел свои сущности из базы данных MySQL. После того как я удалил файлы orm.xml, я смог запустить пользовательские запросы в хранилище.
1

Если вы используете PHP-FPM, эта проблема может сохраняться даже после всех вышеперечисленных решений, которые вы пытались использовать, используя sudo service php5-fpm restart, который помогло.

0

В Symfony 3 вам, вероятно, не хватает класса репозитория в вашем файле orm.xml.

repository-class="Bundle\Repository\MyRepository"

Пример:

<doctrine-mapping>
    <entity name="Bundle\Entity\MyEntity"
            table="tablename"
            repository-class="Bundle\Repository\MyRepository">
        <id name="id" type="integer" column="id">
            <generator strategy="AUTO"/>
        </id>
    </entity>
</doctrine-mapping>
0

Для меня это помогло перезапустить мой vm (Vagrant Box)

  • 1
    Я очень сомневаюсь, что это ответ на вопрос. Если вообще, это должен быть комментарий. И у вас достаточно репутации, чтобы комментировать!
  • 0
    @ GhostCat для меня это помогло, так почему бы не ответить? Есть некоторая проблема с кешированием доктрин или чем-то, и это исправило это. Я хотел бы знать больше об этом, но это решило мою проблему, и я искал часы ...
0
 * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")

Попробуйте поместить класс репозитория в тот же каталог рядом с классом Entity:

     * @ORM\Entity(repositoryClass="Blogger\BlogBundle\BlogRepository")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню