Symfony2s doctrine:generate:实体不生成repo类

时间:2013-01-01 23:16:07

标签: symfony doctrine

我选择Symfony2 docs。据说添加

/**
 * @ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\ProductRepository")
 */
在我的实体文件中

并运行php app/console doctrine:generate:entities Acme应创建ProductRepository文件。它没有。我不能更清楚地说明这一点,它只是不创建该文件,只是重新创建之前存在的那些实体文件。

6 个答案:

答案 0 :(得分:26)

我遇到了同样的问题

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

  

如果您在添加repositoryClass映射之前已经生成了实体类,则必须自己创建该类。幸运的是,这很容易。只需在捆绑包的Repository目录中创建类,并确保它扩展了Doctrine \ ORM \ EntityRepository。创建类后,您可以添加任何方法来查询实体。

很简单,我们必须手动完成,因为我们已经运行过一次

答案 1 :(得分:8)

您可以尝试指定特定的捆绑包:

php app/console doctrine:generate:entities AcmeStoreBundle

请注意,我有完整的捆绑名称。

即使您之前运行doctrine:generate:entities,这也必须有所帮助。

答案 2 :(得分:8)

如果您使用orm.yml文件生成实体,则可以定义repositoryClass,然后再次生成实体:

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

然后运行:

php app/console doctrine:generate:entities AcmeStoreBundle

答案 3 :(得分: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

现在你有了一个实体和存储库。 :)

答案 4 :(得分:1)

要解决此问题并生成repo类,您可以临时修改以下文件的结尾的symfony \厂商\教义\学说束\学说\捆绑\ DoctrineBundle \命令\ 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());
} 

一些解释:在此代码中,

  • 如果条件简化,使用&#39; if(true)&#39; (如果你愿意,最终可以完全被压制)
  • $ m-&gt; customRepositoryClassName 替换为 $ m-&gt; name。&#34; Repository&#34;
  • 我在生成repo文件时添加了一些输出以便充分了解(在终端窗口中)。

如果您不使用&#39; if(true)&#39;条件,并希望自己检查一下,你也可以添加一个带有输出的兼性其他案例,以便将来获得充分的信息:

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

修改完成后,您可以照常重新运行命令:

php app/console doctrine:generate:entities AcmeStoreBundle

这是一个临时代码,因为直到现在问题对我来说都不是很清楚,我看到的唯一的事情是它似乎来自$ m-&gt; customRepositoryClassName ,它返回一个空串。 因此,要找到另一个明确的解决方案,可以采用一种方法来检查元数据对象的方法customRepositoryClassName ...

答案 5 :(得分:-3)

基于Astucieux的回答:

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