ojezu / configurable-discrimination-bundle

Symfony2 扩展包,允许在子扩展包中配置 Doctrine 区分映射。

v2.0.0 2017-10-30 15:14 UTC

This package is auto-updated.

Last update: 2024-09-13 23:19:00 UTC


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