2013-03-09 2 views
10

Symfony2 튜토리얼 (4 장)을 따르고 있지만 사용자 지정 리포지토리에서 getLatestBlogs 메서드를 검색하는 데 문제가 있습니다.사용자 정의 리포지토리를 사용할 수 없습니다.

저는 Linux Mint의 Phar에서 Symfony 2.2를 사용하고 있습니다.

저장소를 직접 만들었지 만 난처한 상황입니다. 나는 다른 유사한 질문을 봤지만 아무 소용이있다

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

:이 오류가 발생합니다. 아무도 내 코드에서 오류를 발견 할 수 있습니까?

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

다음과 같이

추가 정보는

내 composer.json 읽기

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 인 경우 yml 파일에 repositoryClass을 정의해야합니다.

+0

좋은 전화. 항상 annotation으로 엔티티 생성기를 사용하므로 yml에 대해서는 생각해 본 적이 없다. 형사 였을 것이다. : p – keyboardSmasher

+0

yml은 이해하기 쉽고 이해하기 쉽다 : P –

+0

나를 위해 # 2 근무, 내 VM을 다시 시작조차 모든 시도했다! –

-1

시도 컨트롤러에 use Blogger\BlogBundle\Entity\Blog;를 추가.

+0

그래도 쓸모가 없다. ( – prime

4

제 문제는 생성 된 xml 파일이 주석을 무시하지 못하게한다는 것입니다. 주석과 다른 유형의 구성이 함께있을 수는 없다는 것을 읽었지만 광산은 여전히 ​​존재한다는 사실을 잊어 버렸습니다.

엔티티 정의 (예 : SomeEntity.orm)가 없는지 확인하십시오.SRC에서 XML)/XXXX/xxxBundle/자원/설정/교리

내 솔루션은 엔티티 주석의 순서 변경했다
+0

고마워요 유용한 팁이었습니다. Doy 당신은 XML 생성을 피하는 방법을 알고 있습니까? – manuelbcd

+0

db에서 sf 엔티티의 데이터를 생성 한 후 xml로 변환 한 다음 나중에 xml에서 annotation으로 변환하여 왜 작동하지 않는지 궁금합니다. 귀하의 답변 덕분에 모든 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

오오 그래 ... 그 이유는 첫 번째 주문이 잘못 되었기 때문입니다. 두 번째 빈 항목이 첫 번째 항목을 '재설정'했기 때문에 논리적으로 보입니다! – Fleskalebas

관련 문제