是否可以在 Symfony 5 捆绑包中使 Doctrine 实体/数据库 table 可选?

Is it possible to make a Doctrine entitiy / database table optional in Symfony 5 bundle?

我正在开发一个 Symfony 5+ 包,我想在不同的项目中使用它。该捆绑包包括许多不同的实体,可以 在项目中使用这些实体。一些项目将使用所有这些实体,而其他项目将只使用其中的一些实体,而一些项目将不使用这些实体中的任何一个,而只使用捆绑包提供的其他功能。

但是,Doctrine 总是会自动为所有项目中的所有这些实体创建相应的数据库表。所以项目数据库中有很多空表/未使用表。

虽然空表没有任何真正的危害,但我认为这并不是一个真正干净的方法。 是否可以将这些实体设为可选,让项目决定使用哪个以及必须创建哪些表?

当然,bundle 有责任确保不能使用已停用的实体,但这没问题。

显然我可以将捆绑包分解成多个不同的捆绑包,它们都只包含一个 few/one 实体,但这会产生大量开销并且不会 clean 要么。

您可以通过编写自己的代码来创建自定义行为 Metadata driver

为了不重写所有内容,您可以扩展 Doctrine\ORM\Mapping\Driver\AnnotationDriver class 并且仅在 className 在您的实体允许列表中时才调用 parent::loadMetadataForClass($className, $metadata);,具体取决于在您的捆绑包配置上。

您需要在 Symfony 上注册您的元数据驱动程序:

doctrine:
  orm:
    mappings:
      your-bundle:
        is_bundle: true
        type: Path\To\Your\Driver
        prefix: 'Namespace\of\your\bundle\Entity\'