2013-01-01 33 views
16

我去與Symfony2 docs。有人說,在我的實體文件中添加Symfony2s學說:生成:實體不生成回購類

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

和運行php app/console doctrine:generate:entities Acme應該創建ProductRepository文件。它沒有。我不能克拉米這更多,它只是沒有創建該文件,只是重新創建那些以前存在的實體文件。

+0

你是如何檢查文件不存在?如果它位於IDE中,請嘗試刷新。該命令沒有說明有關生成Repository文件的任何信息,但無論如何都會生成它們。 – smottt

+0

無論是在IDE和通過Windows的資源管理器。 –

回答

26

我有同樣的問題

但是我在這裏找到了答案: http://brentertainment.com/other/docs/book/doctrine/orm.html

如果你已經加入repositoryClass映射之前已經生成的實體類,你必須創建上你自己的課。幸運的是,這很容易。只需在您的包的Repository目錄中創建該類,並確保它擴展了Doctrine \ ORM \ EntityRepository。一旦你創建了這個類,你可以添加任何方法來查詢你的實體。

簡單,我們需要手工做的,因爲我們已經運行了這個曾經

+2

我正在使用Symfony 2.6,似乎不再是這種情況。我將庫添加到實體上的註釋中,Doctrine生成了庫,即使我之前沒有存儲庫生成實體。 – Chris

+0

是的克里斯,情況並非如此:你是對的。對我而言,這代人仍然無法工作。 在文檔中明確地遵循了Tomek在問題中解釋的路徑:首先創建Entity類(產品在文檔示例中);然後,在註釋中指定repositoryClass之後,您重新運行命令doctrine:generate:entities和Doctrine應該創建一個新文件ProductRepository.php(目前不存在,因爲只有Product.php存在,並且是第一次生成的生成命令已啓動 – Aerendir

+1

在symfony 2.7中,您使用此命令來生成實體和存儲庫類:「php app/console doctrine:generate:entity --entity VisitorData --with-repository」 – Dung

8

你可以嘗試指定特定的捆綁:

php app/console doctrine:generate:entities AcmeStoreBundle

請注意,我有充分的捆綁名稱。

即使您之前運行doctrine:generate:entities,這也必須有所幫助。

1

擺脫這個問題,併產生回購類,可以臨時修改下列文件的末尾: 的symfony \供應商\主義\學說束\原則\包\ DoctrineBundle \ COMMAND \ generateEntitiesDoctrineCommand。 PHP

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

用下面的代碼:

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

幾點說明:在此代碼,

  • 如果條件得到簡化與 '如果(真)'(和終於可以,如果你想完全抑制)
  • $ M-> customRepositoryClassName$更換名稱。「庫」
  • 我添加了一些輸出,以便在生成回購文件時得到充分的信息(在終端窗口中)。

如果不使用「如果(真)」狀態,想自己來檢查的事情,你也可以與輸出加到兼其他情況下得到消息靈通在未來:

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

修改後,您可以重新運行該命令照常:

php app/console doctrine:generate:entities AcmeStoreBundle 

這是一個臨時的代碼,因爲這個問題是不是對我來說很清楚到現在爲止,唯一的事情,我SE e是它似乎來自$ m-> customRepositoryClassName,它返回一個空字符串。 因此,要找到另一個和明確的解決辦法,一個辦法可能是檢查的元數據對象的方法customRepositoryClassName ...

-3

總部設在Astucieux的回答是:

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

這應該是什麼意思? – Aerendir

8

如果您正在使用orm.yml文件生成你的實體,您可以定義repositoryClass,然後重新生成實體:

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

然後運行:

php app/console doctrine:generate:entities AcmeStoreBundle 
2

超簡單的解決辦法是:

生成一個實體,如果您尚未:

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

現在修改這些註釋行到您以前生成的實體:

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

現在,只需運行:

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

現在你有一個實體和存儲庫。 :)