Имя метода должно начинаться с findBy или findOneBy. Неопределенный метод в Symfony?
Я работаю через part4 к Symfony2, и при обновлении кода контроллера и вспомогательного класса я получил следующее сообщение об ошибке
Undefined method 'getLatestBlogs'. The method name must start with either
findBy or findOneBy!
прежде чем я поставил некоторый код в контроллер, который я перешел в свой вспомогательный класс, как учил учебник, что приводит к приведенному выше сообщению об ошибке.
<?php
// src/Blogger/BlogBundle/Repository/BlogRepository.php
namespace BloggerBlogBundleRepository;
use DoctrineORMEntityRepository;
/**
* 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 BloggerBlogBundleEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass="BloggerBlogBundleRepositoryBlogRepository")
* @ORMTable(name="blog")
* @ORMHasLifecycleCallbacks()
* @ORMEntity
*/
class Blog
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
* @ORMHasLifecycleCallbacks()
*/
protected $id;
--
--
}
где я делаю неправильно ?
8 ответов:
убедитесь, что вы изменили свой класс сущностей:
// src/Blogger/BlogBundle/Entity/Blog.php /** * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository") * @ORM\Table(name="blog") * @ORM\HasLifecycleCallbacks() */ class Blog { // .. }аннотации это.
и не забудьте регенерировать сущности:
php app/console doctrine:generate:entities Bloggerобновление
удалить аннотации
@ORM\Entity. Он переопределяет правильную аннотацию@ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
в моем случае добавление правильной аннотации было недостаточным.
Удаление кэша доктрины с помощьюphp app/console doctrine:cache:clear-metadataтоже не работал.
Я генерирую свои сущности из базы данных с помощью командв PHP приложение/консоли учение:сопоставление импорт-сила пакете acmeblogbundle в XML
PHP app / console doctrine: mapping: конвертировать аннотации ./ src
PHP app / console doctrine: generate: entities AcmeBlogBundleпервая команда генерирует orm.xml-файл для каждой БД Таблица в моем проекте. После удаления всех ОРМ.аннотации 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Что сделал трюк для меня.
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")Попробуйте поместить класс репозитория в тот же каталог рядом с классом сущности:
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\BlogRepository")
в Symfony 3 вам, вероятно, не хватает класса репозитория в вашем .
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>
Comments