Имя метода должно начинаться с 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;
--
--
}


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

615   8  

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")

для меня это помогло перезапустить мою виртуальную машину (Vagrant Box)

в 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

    Ничего не найдено.