Имя метода должно начинаться либо с findBy, либо с findOneBy. Неопределенный метод Symfony?
Я работаю через часть 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();
}
}
А вот и мой файл контроллера индекса Action Code:-
// 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;
--
--
}
Где я делаю не так?
9 ответов
Убедитесь, что вы изменили свой класс сущности:
// 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
ОБНОВИТЬ
Удалить аннотацию @ORM\Entity
, Это отменяет правильную аннотацию @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
В моем случае добавление правильной аннотации было недостаточно.
Удаление Доктора Кеша php app/console doctrine:cache:clear-metadata
тоже не сработало.
Я генерирую свои сущности из базы данных командами
php app/console доктрина: отображение: импорт --force AcmeBlogBundle xml
php app/console доктрина: отображение: конвертировать аннотацию./src
php app/console доктрина: генерировать: лица AcmeBlogBundle
Первая команда генерирует файл orm.xml для каждой таблицы БД в моем проекте. После УДАЛЕНИЯ всех файлов orm.xml Аннотации начали работать правильно.
Если вы используете yml в качестве файлов конфигурации для ваших сущностей, попробуйте добавить это:
Blogger\BlogBundle\Entity\Blog:
type: entity
table: Blog
repositoryClass: Blogger\BlogBundle\Repository\BlogRepository
...
а затем, как указано выше:
php app/console doctrine:generate:entities Blogger
Другое решение - удалить все файлы orm.xml, добавленные сгенерированными объектами. Если вы переместите папку или удалите, ваше сопоставление с хранилищем будет оперативным.
В случае, если вы используете PHP-FPM, эта проблема может сохраниться даже после того, как вы попробовали все вышеупомянутые решения, а затем используйте sudo service php5-fpm restart
который сделал трюк для меня.
В моем случае не было никакого метода именно в этом месте. После размещения/создания соответствующего метода ошибка исчезла.
В 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>
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
Попробуйте поместить класс репозитория в тот же каталог рядом с классом Entity:
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\BlogRepository")