2013-03-09 13 views
10

Sto seguendo il tutorial di Symfony2 (capitolo 4), ma sto riscontrando problemi nel recuperare il metodo getLatestBlogs dal mio repository personalizzato.Impossibile ottenere repository personalizzati funzionanti

Sto usando Symfony 2.2 con Phar su Linux Mint.

Ho creato il repository da solo, ma sono perplesso. Ho ricevuto questo errore:

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

Ho cercato su Google altre domande simili ma senza risultato. Qualcuno può individuare l'errore nel mio codice?

Altre Informazioni

mio composer.json recita come segue:

"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"   
}, 

mio 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 
     )); 
    } 

in origine la menzogna e la mia 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 
{ 

e, infine, il mio 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

beh, hai detto di aver creato il repository tu stesso, ma il tuo codice mostra il commento che il comando Doctrine lo genera ?? –

+0

È una copia e incolla dal tutorial. – prime

+0

Indica chiaramente che il nome del metodo non sta seguendo la convenzione. Prova a rinominarlo per findByDate dove Data è il nome di una colonna dell'entità. – Bart

risposta

20

È possibile controllare le seguenti operazioni per risolvere questo problema:

  • Assicurarsi che il FQCN nella vostra annotazione corrisponda al nome di classe del file repository e si è impostata la namespace destra.

  • Cancella tutta la cache dei metadati se si dispone di questa cache attiva o temporanea della cache di Doctrine.

    app/console doctrine:cache:clear-metadata

  • Controllare se il tipo di mappatura è impostato su annotation nella configurazione. Ad esempio, se hai yml devi definire il tuo repositoryClass nel file yml.

+0

Buona chiamata, uso sempre il generatore di entità con annotazioni, quindi non ho mai pensato a yml. Avresti dovuto essere un detective: p – keyboardSmasher

+0

yml è buono e facile da capire: P –

+0

Per me # 2 ha funzionato, aveva provato tutto anche riavviando il mio VM! –

-1

Prova ad aggiungere use Blogger\BlogBundle\Entity\Blog; al controller.

+0

Provato ma inutilmente :( – prime

4

Il mio problema era il fatto che i file xml generati continuavano a scavalcare le annotazioni. Ho letto che le annotazioni e altri tipi di configurazione non possono risiedere insieme, ma ho dimenticato che il mio era ancora presente.

Assicurarsi di non avere definizioni di entità (ad esempio SomeEntity.orm.xml) in src/xxxx/xxxBundle/Resources/config/doctrine

+0

Grazie , è stato un suggerimento utile. Sai come evitare la generazione xml? – manuelbcd

+0

Ho generato i dati dall'entità db do sf, prima su xml e successivamente ho effettuato la conversione da xml a annotazione e mi chiedevo perché non voleva funzionare. Grazie alla tua risposta ho eliminato tutti i file xml e ha iniziato a funzionare. – user3383675

2

La mia soluzione era quella di modificare l'ordine delle annotazioni entità:

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

non ha funzionato, ma

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

fatto lavoro :)

+1

Il secondo '@ORM \ Entity' sostituirà il primo, non è necessario quello che non definisce il' repositoryClass'. – DanielM

+0

Oh sì ... ecco perché il primo ordine è andato storto, perché la (seconda) Entità vuota stava "ripristinando" il primo ... sembra logico! – Fleskalebas

Problemi correlati