2013-01-01 11 views
16

Idę z Symfony2 docs. Mówi się, że dodanieDoktryna Symfony2s: generate: entity nie generuje klas repo

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

w moim pliku podmiotu i działa php app/console doctrine:generate:entities Acme należy utworzyć plik ProductRepository. Tak nie jest. Nie mogę tego bardziej wyjaśnić, po prostu nie tworzę tego pliku, odtwarzam tylko te pliki encji, które były tam wcześniej.

+0

Jak sprawdzasz, że pliki nie istnieją? Jeśli znajduje się wewnątrz IDE, spróbuj odświeżyć. Polecenie nie mówi nic o generowaniu plików repozytorium, ale generuje je mimo to. – smottt

+0

Zarówno w środowisku IDE, jak i za pośrednictwem przeglądarki Windows. –

Odpowiedz

26

Mam ten sam problem

Ale znalazłem odpowiedź tutaj: http://brentertainment.com/other/docs/book/doctrine/orm.html

Jeśli już generowane swoją klasę encji przed dodaniem odwzorowania repositoryClass, trzeba stworzyć klasę na własną rękę. Na szczęście to całkiem proste. Po prostu utwórz klasę w katalogu Repository swojego pakietu i upewnij się, że rozszerza ona Doctrine \ ORM \ EntityRepository. Po utworzeniu klasy możesz dodać dowolną metodę do wysyłania zapytań do swoich podmiotów.

Proste, musimy to zrobić ręcznie, ponieważ mamy już uruchomić ten jeden raz

+2

Używam Symfony 2.6 i wygląda na to, że tak już nie jest. Dodałem repozytorium do adnotacji na mojej encji, a Doctrine wygenerowało repozytorium, mimo że wcześniej wygenerowałem obiekt bez repozytorium. – Chris

+0

Tak, Chris, tak nie jest: masz rację. Dla mnie to pokolenie nadal nie działa. W dokumentacji wyraźnie widać ścieżkę opisaną w pytaniu przez Tomka: najpierw należy utworzyć klasę Entity (produkty w przykładach do dokumentu); następnie, po określeniu klasy repositoryClass w adnotacjach, ponownie uruchomisz komendę doctrine: generate: entity, a Doctrine utworzy nowy plik ProductRepository.php (który obecnie nie istnieje, ponieważ istnieje tylko Product.php i został wygenerowany za pierwszym razem Komenda generowania została uruchomiona – Aerendir

+1

W Symfony 2.7 używasz tego polecenia do generowania obu klas Entity i Repository: "php app/console doctrine: generate: entity --entity VisitorData - with-repository" – Dung

8

Można próbować określić konkretny pakiet:

php app/console doctrine:generate:entities AcmeStoreBundle

Zauważ, że mam pełne zawiera nazwę pakietu.

To musi pomóc, nawet jeśli wcześniej korzystasz z wersji doctrine:generate:entities.

1

Aby pozbyć się tego problemu i wygenerować klas repo, można tymczasowy modyfikować koniec następnego pliku: symfony \ vendor \ doktryna \ doktryna-pakiet \ Doctrine \ Bundle \ DoctrineBundle \ command \ generateEntitiesDoctrineCommand. php

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

z następującego kodu:

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

Niektóre wyjaśnienia: w tym kodzie,

  • jeśli warunek jest uproszczona z 'if (true)' (i może w końcu zostać całkowicie zniesione, jeśli chcesz)
  • $ m-> customRepositoryClassNamezastępuje$ m-> name. "Repository"
  • Dodałem trochę danych wyjściowych, aby być dobrze poinformowanym (w oknie terminala), kiedy generowane są pliki repo.

Jeśli nie używać „if (true)” warunek i chcesz sprawdzić rzeczy samemu, można również dodać fakultatywnego innego sprawę z wyjściem, aby dobrze poinformowany w przyszłości:

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

Po modyfikacjach, można ponownie uruchomić komendę jak zwykle:

php app/console doctrine:generate:entities AcmeStoreBundle 

jest to tymczasowy kod, ponieważ problem nie jest bardzo jasne dla mnie do tej pory, jedynym co ja se e jest to, że wydaje się pochodzić z $ m-> customRepositoryClassName, który zwraca pusty łańcuch. Tak więc, aby znaleźć inny i ostateczne rozwiązanie, sposób może być, by sprawdzić metoda customRepositoryClassName obiektu metadanych ...

-3

siedzibą w Astucieux za odpowiedź:

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

Co to powinno oznaczać? – Aerendir

8

Jeśli używasz orm.yml plików aby wygenerować podmioty, można zdefiniować repositoryClass, a następnie wygenerować podmioty ponownie:

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

a następnie uruchom:

php app/console doctrine:generate:entities AcmeStoreBundle 
2

Super proste rozwiązanie do tego:

Generowanie podmiot jeśli jeszcze go nie masz:

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

Teraz zmodyfikować te linie komentarz do wcześniej utworzonej jednostki:

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

teraz , po prostu uruchom:

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

Teraz masz jednostkę i repozytorium. :)

Powiązane problemy