2013-03-09 2 views
10

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

Я использую Symfony 2.2 с Phar на Монетном дворе Linux.

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

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

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

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

Мой 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 
{ 

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

} 
+0

ну, вы сказали, что создали репозиторий самостоятельно, но ваш код показывает комментарий, который команда Doctrine генерирует? –

+0

Это вырезание и вставка из учебника. – prime

+0

В нем четко указано, что имя метода не соответствует соглашению. Попробуйте переименовать его в findByDate, где Date - это имя столбца объекта. – Bart

ответ

20

Вы можете проверить следующее, чтобы решить эту проблему:

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

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

    app/console doctrine:cache:clear-metadata

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

+0

Хороший вызов. Я всегда использую генератор сущности с аннотациями, поэтому я никогда не думал о yml. Вы должны были быть детективом: p – keyboardSmasher

+0

yml хорошо и легко понять: P –

+0

Для меня # 2 работал, попробовал все, даже перезапустив мой vm! –

-1

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

+0

Пробовал это, но безрезультатно :( – prime

4

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

Убедитесь, что у вас нет определений сущностей (т. Е. SomeEntity.orm.XML) в ИПВ/хххх/xxxBundle/Ресурсы/конфигурации/доктрина

+0

Спасибо , это был полезный совет. Дой, вы знаете, как избежать генерации xml? – manuelbcd

+0

Я сгенерировал данные из db do sf entity, сначала в xml, а позже сделал преобразование из xml в аннотацию, и мне стало интересно, почему он не хочет работать. Благодаря вашему ответу я удалил все xml-файлы и начал работать. – user3383675

2

Мое решение было изменить порядок сущностей аннотаций:

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

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

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

сделал work :)

+1

Второй '@ORM \ Entity' переопределяет первый, вам не нужен тот, который не определяет' repositoryClass'. – DanielM

+0

О да ... вот почему первый заказ поступил не так, потому что (вторая) пустая Entity была «перезагружена» первой ... кажется логичной! – Fleskalebas

Смежные вопросы