2013-01-01 1 views
16

Vado con Symfony2 docs. Si dice che l'aggiunta diDocente di symfony2: generate: le entità non generano classi di pronti contro termine

/** 
* @ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\ProductRepository") 
*/ 

nel mio file entità e l'esecuzione php app/console doctrine:generate:entities Acme dovrebbe creare il file ProductRepository. Non è così. Non riesco a chiarirlo di più, semplicemente non crea quel file, semplicemente ricrea quei file di entità che erano lì prima.

+0

Come stai verificando che i file non esistono? Se è all'interno di un IDE, prova ad aggiornare. Il comando non dice nulla sulla generazione di file di repository, ma li genera comunque. – smottt

+0

Sia in IDE che attraverso Windows 'explorer. –

risposta

26

Sto avendo lo stesso problema

Ma ho trovato la risposta qui: http://brentertainment.com/other/docs/book/doctrine/orm.html

Se avete già generato la classe entità prima di aggiungere la mappatura repositoryClass, è necessario creare la classe per conto tuo. Fortunatamente, è abbastanza facile. Basta creare la classe nella directory del repository del bundle e assicurarsi che estenda Doctrine \ ORM \ EntityRepository. Una volta creata la classe, puoi aggiungere qualsiasi metodo per interrogare le tue entità.

Semplice, dobbiamo farlo a mano perché abbiamo già eseguito una volta

+2

Sto usando Symfony 2.6 e sembra che questo non sia più il caso. Ho aggiunto il repository all'annotazione sulla mia entità e Doctrine ha generato il repository anche se in precedenza avevo generato l'entità senza un repository. – Chris

+0

Sì Chris, questo non è il caso: hai ragione. Per me la generazione continua a non funzionare. Nella documentazione è chiaramente seguito il percorso spiegato nella domanda da Tomek: innanzitutto si crea la classe Entity (Prodotti negli esempi di documentazione); quindi, dopo che il repositoryClass è stato specificato nelle annotazioni, si esegue nuovamente il comando doctrine: generate: entity e Doctrine dovrebbe creare un nuovo file ProductRepository.php (che al momento non esiste, poiché esiste solo Product.php ed è stato generato la prima volta – Aerendir

+1

In symfony 2.7 si utilizza questo comando per generare entrambe le classi Entity e Repository: "php app/console doctrine: generate: entity --entity VisitorData --with-repository" – Dung

8

Si può provare a specificare un particolare bundle:

php app/console doctrine:generate:entities AcmeStoreBundle

Nota che ho il pieno nome dei pacchi.

Questo deve essere d'aiuto anche se si esegue doctrine:generate:entities in precedenza.

1

per sbarazzarsi di questo problema e generare classi di pronti contro termine, è possibile temporanea modificare la fine del file seguente: Symfony \ vendor \ dottrina \ dottrina-fascio \ Doctrine \ Bundle \ DoctrineBundle \ Command \ generateEntitiesDoctrineCommand. php

if ($m->customRepositoryClassName 
    && false !== strpos($m->customRepositoryClassName, $metadata->getNamespace())) { 
    $repoGenerator->writeEntityRepositoryClass(
     $m->customRepositoryClassName, $metadata->getPath()); 
} 

con il seguente codice:

if (true) { 
    $output->writeln(
    sprintf(' > AND Repository <comment>%s</comment>', $m->name . "Repository") 
    );   
    $repoGenerator->writeEntityRepositoryClass(
    $m->name . "Repository", $metadata->getPath()); 
} 

Alcune spiegazioni: in questo codice,

  • il se la condizione è semplificata con 'se (vero)' (e potrebbe finalmente essere completamente soppresso, se si desidera)
  • $ M-> customRepositoryClassNameè sostituito dal$ m-> nome. "Repository"
  • Ho aggiunto alcuni output per essere ben informati (nella finestra del terminale) quando vengono generati i file repo.

Se non si utilizza il 'se (vero)' stato, e si desidera controllare le cose da solo, è anche possibile aggiungere un caso facoltativa altro con un'uscita per ottenere ben informati in futuro:

else { 
     $output->writeln(sprintf(' > NO repository generated for this class')); 
    } 

Dopo le modifiche, è possibile ri-eseguire il comando, come al solito:

php app/console doctrine:generate:entities AcmeStoreBundle 

si tratta di un codice provvisorio, perché il problema non è molto chiaro per me fino ad ora, le uniche cose che SE e è che sembra provenire da $ m-> customRepositoryClassName che restituisce una stringa vuota. Quindi, per trovare un'altra soluzione definitiva, un modo potrebbe essere quello di controllare il metodo customRepositoryClassName dell'oggetto metadati ...

-3

sede a risposta di Astucieux:

if (true) { 
    $fullRepositoryClassName = $name . "\\Repository\\" . $basename . "Repository"; 
    $output->writeln(
     sprintf(' > AND Repository <comment>%s</comment>', $fullRepositoryClassName) 
    );   
    $repoGenerator->writeEntityRepositoryClass(
     $fullRepositoryClassName, $metadata->getPath()); 
} 
+1

Cosa significa questo? – Aerendir

8

Se si utilizzano file orm.yml per generare i soggetti, è possibile definire le repositoryClass, e quindi generare le entità di nuovo:

Acme\StoreBundle\Entity\Product: 
type: entity 
table: product 
... 
repositoryClass: Acme\StoreBundle\Entity\ProductRepository 
... 

e quindi eseguire:

php app/console doctrine:generate:entities AcmeStoreBundle 
2

Super facile soluzione a questo:

generare un'entità se non l'hai già:

php app/console doctrine:generate:entity --entity="AppBundle:EntityName" --fields="id:string(255) content:text(100)" 

Ora modificare queste righe di commento al vostro precedentemente generato Entità:

* @ORM\Table(name="TABLENAME") 
* @ORM\Entity(repositoryClass="AppBundle\Entity\EntityNameRepository") 

Ora , esegui:

php app/console doctrine:generate:entities AppBundle:EntityNameRepository 

Ora hai un'entità e un repository. :)