ojezu / configurable-discrimination-bundle
Symfony2 扩展包,允许在子扩展包中配置 Doctrine 区分映射。
Requires
- doctrine/orm: ^2.5
- symfony/config: ^3.0 || ^2.7
- symfony/dependency-injection: ^3.0 || ^2.7
- symfony/http-kernel: ^3.0 || ^2.7
Requires (Dev)
README
此扩展包解决了 Doctrine 继承问题:discriminatorMap 必须在父实体中声明,并且必须包含所有子实体的声明。如果您将其留空,Doctrine 将扫描所有文件以查找扩展父类的类,并将自动生成它们的条目和区分值 - 在这种情况下,程序员对此完全无法控制 - 它们将从子类的名称派生,仅此而已。
特别是,如果某些子类在其他扩展包中,程序员必须让父扩展包了解所有子类!
此扩展包允许在子扩展包的配置中指定区分值和子类,从而使父扩展包的代码清晰,没有任何对子扩展包的引用,避免了扫描所有类文件以查找子类,并允许指定自定义的区分值。
安装
composer require ojezu/configurable-discrimination-bundle
用法
在 app/appKernel.php 中注册此扩展包
class AppKernel extends Kernel { public function registerBundles() { $bundles = array( new OJezu\ConfigurableDiscriminationBundle\ConfigurableDiscriminationBundle(), // app bundles new Acme\TestBundle\ParentBundle(), new Acme\TestBundle\ChildABundle(), new Acme\TestBundle\ChildBBundle(), ); return $bundles; } }
在父扩展包中
您必须声明非空的 discriminatorMap,否则 Doctrine 将尝试自动生成它。OJezu/ConfigurableDiscriminationBundle 将只向其中添加条目。
#Acme/AcmeParent/Entity/AcmeParent.php /** * (...) * @ORM\DiscriminatorMap({"base" = "AcmeParent"}) */ class AcmeParent { (...) }
在子AB扩展包中
添加一些标记为 ojezu.configurable_discrimination
的模拟服务到您的扩展包内部配置中,以便 OJezu/ConfigurableDiscriminationBundle 可以读取您的自定义配置。
服务名称无关紧要。
# service.yml services: acme.acme_entity.acme_child_a: class: 'Acme\AcmeChildA\Entity\AcmeChildA' public: false tags: - name: ojezu.configurable_discrimination discriminator_value: 'acme_child_a'
Acme\AcmeChildA\Entity\AcmeChildA
当然必须定义,并直接扩展 Acme\AcmeParent\Entity\AcmeParent
在子B扩展包中
# service.yml services: acme.acme_entity.acme_child_b: class: 'Acme\AcmeChildB\Entity\AcmeChildB' public: false tags: - name: ojezu.configurable_discrimination discriminator_value: 'acme_child_b'
致谢
感谢 https://github.com/sredni,他帮助我进入 Symfony 并对此包进行了代码审查。
此包在一定程度上基于 DCSDynamicDiscriminatorMapBundle 以及 在 Doctrine 2 中在子级别定义区分映射。
许可证
MIT