facile-it/doctrine-dynamic-discriminator-map

此包已被废弃,不再维护。未建议替代包。

Doctrine ORM 的动态区分符映射

0.2.0 2018-04-18 21:43 UTC

This package is auto-updated.

Last update: 2019-08-21 10:53:44 UTC


README

Build Status Code Coverage Scrutinizer Code Quality Latest Stable Version Total Downloads Latest Unstable Version License

添加使用配置声明实体区分符映射的能力。

安装

$ composer require facile-it/doctrine-dynamic-discriminator-map

在 Doctrine 事件管理器上注册监听器

示例

<?php

use Doctrine\Common\EventManager;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Tools\Setup;
use Facile\DoctrineDDM\Factory\MetadataConfigFactory;
use Facile\DoctrineDDM\MetadataListener;
use My\Namespace\Entity;

$metadataConfigFactory = new MetadataConfigFactory();
// discriminator map configuration
$metadataConfig = $metadataConfigFactory->createMetadata([
    Entity\Person::class => [ // parent class
        'discriminator_map' => [
            'teacher' => Entity\Teacher::class, // child class
            'student' => Entity\Student::class, // child class
        ],
    ],
]);

$metadataListener = new MetadataListener($metadataConfig);

$eventManager = new EventManager();
$eventManager->addEventSubscriber($metadataListener);

$config = Setup::createAnnotationMetadataConfiguration(
    [__DIR__ . '/src'],
    true,
    null,
    null,
    false
);
$connection = [
    'driver' => 'pdo_sqlite',
    'memory' => true,
];

$entityManager = EntityManager::create($connection, $config, $eventManager);

实体

创建父实体

<?php

namespace My\Namespace\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="person")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({"person" = "Person"})
 */
class Person
{
    // ...
}

然后您可以声明子实体

<?php

namespace My\Namespace\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Student extends Person
{
    // ...
}

/**
 * @ORM\Entity
 */
class Teacher extends Person
{
    // ...
}

就是这样!

框架集成

可调用工厂

Facile\DoctrineDDM\Factory\MetadataConfigFactoryFacile\DoctrineDDM\Factory\MetadataListenerFactory 有一个 __invoke() 方法,可以与 Interop\Container\ContainerInterface 一起使用。

Facile\DoctrineDDM\Factory\MetadataConfigFactory 将检查一个 config 键,它期望一个数组配置。
然后它将检查 Facile\DoctrineDDM\Factory\MetadataConfigFactory::CONFIG_KEY 键,它期望区分符映射配置,并返回一个 Facile\DoctrineDDM\Configuration\Metadata 实例。

Facile\DoctrineDDM\Factory\MetadataListenerFactory 将检查名为 Facile\DoctrineDDM\Configuration\Metadata 的服务(配置类),然后返回一个配置好的 Facile\DoctrineDDM\MetadataListener 实例。

Zend 框架和 Zend Expressive

使用 DoctrineORMModule


use Facile\DoctrineDDM\MetadataListener;
use Facile\DoctrineDDM\Factory\MetadataConfigFactory;
use Facile\DoctrineDDM\Factory\MetadataListenerFactory;
use Facile\DoctrineDDM\Configuration\Metadata;
use My\Namespace\Entity;

return [
    'service_manager' => [ // or "dependencies" for zend-expressive
        'factories' => [
            // register the configuration factory
            Metadata::class => MetadataConfigFactory::class,
            // register the metadata listener factory
            MetadataListener::class => MetadataListenerFactory::class,
        ],
    ],
    'doctrine' => [
        'eventmanager' => [
            'orm_default' => [
                'subscribers' => [
                    // register MetadataListener
                    MetadataListener::class,
                ],
            ],
        ],
    ],
    // declare discriminator map configuration used by MetadataConfigFactory
    MetadataConfigFactory::class => [
        Entity\Person::class => [ // parent class
            'discriminator_map' => [
                'teacher' => Entity\Teacher::class, // child class
                'student' => Entity\Student::class, // child class
            ],
        ],
    ],
];