【问题标题】:Symfony2: Creating entity table conditionallySymfony2:有条件地创建实体表
【发布时间】:2016-03-03 23:34:27
【问题描述】:

我有一个包含在其中定义的实体的捆绑包。我希望能够以这种方式配置这个捆绑包,这个实体将或不会相关。因此,如果正确配置了 bundle,则不应使用 app/console doctrine:schema:update 等创建实体表,或者应该 - 它应该取决于配置。

如何有条件地“禁用”实体,使其表不会由app/console doctrine:schema:update 创建?

【问题讨论】:

  • 你可以告诉学说在映射部分下搜索实体的目录:symfony.com/doc/current/reference/configuration/doctrine.html 所以我想你可以把这个实体放在它自己的目录中。但我怀疑你可能让事情变得比他们需要的更困难。
  • 原因是我目前有两个bundle:Config和ConfigDb,第二个是第一个的存储后端,它使用Doctrine。我想合并两者并默认提供数据库后端,但可切换。现在的问题是,如果它将与另一个后端服务切换,显然我不希望创建实体表:)。所以我需要创建这些表,并有条件地使用这些实体。
  • 您可以在配置中禁用自动映射并使用手动映射。或者我认为更好的方法是创建具有映射的模型类,并在您的每个应用程序中实现扩展此模型的空实体。您甚至可以让这些模型实现接口并在引用中使用它,而不是在教义配置中用真实类替换接口。

标签: symfony doctrine-orm entity


【解决方案1】:

您的方案要求您禁用auto_mapping,但它似乎默认设置为falsehttp://symfony.com/doc/current/reference/configuration/doctrine.html

接下来要做的是确保您的捆绑包的 build 函数有条件地添加所需的 DoctrineOrmMappingPass,如下所述:https://stackoverflow.com/a/26975083/1794894

正如你可以see in the source 一样,build 仅在缓存为空时才会执行,所以这是你可以执行此操作的地方。你也可以在那里看看如何add compiler passes

【讨论】:

    【解决方案2】:

    我认为,虽然也许你能找到办法,但你让自己复杂化了。如果后端包是独立的,那么总是可以选择安装它,因此它是创建的实体还是不创建的实体。

    您可以在 Sonata bundles 中找到一个示例,您可以根据需要管理用户,但是如果您使用 FOSUserBundle,您可以选择安装 SonataUserBundle,然后告诉 fos_user 配置新类属于 Sonata由于类继承,用户以及因此新实体将保留许多新属性,并且用户的所有 crud 操作将已经在奏鸣曲视图中配置。 SonataUser 也有自己的用户实体,可以独立使用。

    我知道这不是您所要求的,但可能您只需要设法遵循这样的模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多