2011-11-16 11 views
31

Sono nuovo in symfony2.ho creato una classe di repository quando ho creato una classe di entità tramite la riga di comando. Ma non potevo accedere alle mie funzioni personalizzate in quella classe di repository. come creare una classe di repository personalizzata in symfony2? Qualcuno può darmi una spiegazione passo dopo passo da zero con qualche codice di esempio?classe di repository personalizzata in symfony2

Qui di seguito è la mia classe repository

namespace Mypro\symBundle\Entity; 

use Doctrine\ORM\EntityRepository; 

/** 
* RegisterRepository 
* This class was generated by the Doctrine ORM. Add your own custom 
* repository methods below. 
*/ 
class RegisterRepository extends EntityRepository 
{ 


    public function findAllOrderedByName() 
    { 
     return $this->getEntityManager() 
      ->createQuery('SELECT p FROM symBundle:Register p ORDER BY p.name ASC') 
      ->getResult(); 
    } 


} 

ho chiamato il mio controller come questo senso

$em = $this->getDoctrine()->getEntityManager(); 
      $pro = $em->getRepository('symBundle:Register') 
      ->findAllOrderedByName(); 

ho ottenuto l'errore sotto

Undefined method 'findAllOrderedByName'. The method name must start with either findBy or findOneBy! 

Devo qualsiasi errore nel mio codice ? Qualche errore nella creazione di una classe di repository? ho bisogno di usare qualsiasi classe.

risposta

68

Penso che abbiate appena dimenticato di registrare questo repository nella vostra entità. Devi solo aggiungere nel tuo file di configurazione dell'entità la classe repository.

In src/Mypro/symBundle/Resources/config/doctrine/Register.orm.yml:

Mypro\symBundle\Entity\Register: 
    type: entity 
    repositoryClass: Mypro\symBundle\Entity\RegisterRepository 

Non dimenticare di svuotare la cache dopo questa modifica, per ogni evenienza.

E se si sta utilizzando le annotazioni (invece di yml config) allora, invece di quanto sopra, aggiungere qualcosa come:

/** 
* @ORM\Entity(repositoryClass="Mypro\symBundle\Entity\RegisterRepository") 
*/ 

alla classe entità per registrare il repository

+0

Reuven ho ottenuto l'output corretto, ma nella mia IDE Netbeans non sono riuscito a rilevare il repository function.y personalizzato? lo sai? –

+0

Non credo sia possibile per netbean conoscere il repository personalizzato. La mia versione di netbean non completa automaticamente il codice specifico di symfony. – Reuven

+0

Ho lo stesso problema e ho generato EntityRepository con Symfony ... ma non ho nessuna cartella chiamata "doctrine" in src/Projet/Bundle/Resources/config/... cosa c'è che non va? – httpete

6

Il manuale ha un bella guida passo passo ... http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

  • prima definire la classe repository nella configurazione di annotazioni/yaml
  • Creare la classe
  • Creare la funzione
  • Quindi chiamare la funzione appena creato ....
+0

esempio da manaul non funziona con Symfony 2.1.1, a meno che non si cambi l'annotazione da '@ORM \ Entity (repositoryClass =" Acme \ StoreBundle \ Repository \ ProductRepository ")' a qualcosa come '@ORM \ Entity (repositoryClass =" Acme \ StoreBundle \ Entity \ ProductRepository ")' che inizia con lo spazio dei nomi per il file Entity \ Product.php – yitwail

2

Prima di tutto non è necessario repo personalizzato per farlo .. È possibile impostare l'ordine clausola nel metodo EM getRepository findBy:

//$em - entity manager 
//from Doctrine documentation: findBy(criteria(array), order(array), limit, offset) 
$result = $em->getRepository('symBundle:Register')->findBy(array(), array('name' => 'ASC')) 
4

anch'io perso un sacco di tempo in cui sono entrato in questo pasticcio di configurazione. Stavo configurando la classe repository nella mia Entity come mapping delle annotazioni. La mappatura era presente ma il repository non era ancora associato all'entità. Quando ho spostato la mappatura delle annotazioni, ad esempio @ORM \ Entity (repositoryClass = "Acme \ DemoBundle \ Entity \ UserRepository"), ha funzionato.

/* 
* User 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\UserRepository") 
*/ 
class User 
{ 
... 
}` 
+0

Weird, che ha funzionato anche per me dopo aver trascorso le ultime 2 ore cercando di capire quale fosse il problema. –

2

ho semplicemente seguire per la documentazione nativa doc e cercare l'annotazione che ho selezionato. Ad esempio ho selezionato yaml, ho aggiunto configurazioni a Product.orm.yml e Category.orm.file YML, anche aggiungere nuovi php attribuisce ai metodi di entità:

protected $products; 

public function __construct() 
{ 
    $this->products = new ArrayCollection(); 
} 

per category.php e

protected $category; 

per Product.php

quindi eseguire php app/console doctrine:generate:entities Acme , che aggiungono con successo nuovi getter e setter

4

xml per mappatura: Aggiornamento file di mapping xml nella cartella Risorsa/config/doctrine, ad d attributo repository-classe:

<entity name="Ccd\Bundle\FrontendBundle\Entity\UvUpdatePageContent" table="uv_update_page_content" repository-class="Ccd\Bundle\FrontendBundle\Entity\UvUpdatePageContentRepository"> 

http://doctrine-mongodb-odm.readthedocs.org/en/latest/cookbook/mapping-classes-to-orm-and-odm.html quindi aggiornare la cache:

php app/console doctrine:cache:clear-metadata 
php app/console cache:clear 
Problemi correlati