streamcommon/doctrine-manager

Doctrine 2 容器互操作


README

Latest Stable Version Total Downloads License

此包提供了 Doctrine 2 工厂,用于符合 PRS-11 容器标准。

分支

Master Build Status Coverage Status

Develop Build Status Coverage Status

安装

控制台运行

    composer require streamcommon/doctrine-manager

或者添加到你的 composer.json

    "require": {
        "streamcommon/doctrine-manager": "*"
    }

请查阅 doctrine 文档以获取更多信息

示例配置项目文件

Psr\Container\ContainerInterface 容器必须具有 config

配置你的项目配置文件

  1. 配置 doctrine 配置,例如
    'config' => [
        'doctrine' => [
            'configuration' => [
            // If you use single connection
                'orm_default' => [
                    'result_cache' => 'array',
                    'metadata_cache' => 'array',
                    'query_cache' => 'array',
                    'hydration_cache' => 'array',
                    'driver' => 'orm_default',
                ],
             
            // If you want to add a second connection
                'orm_custom' => [
                    'result_cache' => 'memcached',
                    'metadata_cache' => 'memcached',
                    'query_cache' => 'memcached',
                    'hydration_cache' => 'memcached',
                    'driver' => 'orm_custom',
                ],
            ],
  2. 配置连接选项,例如
            'connection' => [
            // If you use single connection
            // Default using MySql connection
                'orm_default' => [
                    'configuration' => 'orm_default',
                    'event_manager' => 'orm_default',
                    'params' => [
                        'dbname' => 'name',
                        'user' => 'user',
                        'password' => 'password',
                        'host' => 'localhost',
                    ],
                ],
             
            // If you want to add a second connection
            // Alternative Postgress connection
                'orm_custom' => [
                    'configuration' => 'orm_custom',
                    'event_manager' => 'orm_custom',
                    'driver_class_name' => \Doctrine\DBAL\Driver\PDOPgSql\Driver::class,
                    'params' => [
                        'dbname' => 'name',
                        'user' => 'user',
                        'password' => 'password',
                        'host' => 'localhost_custom',
                    ],
                ]
            ],
  3. 配置实体|事件管理器
            'entity_manager' => [
                'orm_default' => [
                    'connection' => 'orm_default',
                    'configuration' => 'orm_default',
                ],
                'orm_custom' => [
                    'connection' => 'orm_custom',
                    'configuration' => 'orm_custom',
                ]
            ],
            'event_manager' => [
                'orm_default' => [
                    'subscribers' => [],
                ],
                'orm_custom' => [
                    'subscribers' => [],
                ]
            ],
            'entity_resolver' => [
                'orm_default' => [
                    'resolvers' => [],
                ],
                'orm_custom' => [
                    'resolvers' => [],
                ],
            ],
  4. 配置 ORM 驱动,例如
            'driver' => [
             // If you use single connection
             // Annotation driver example 
             //@see https://www.doctrine-project.org/projects/doctrine-annotations/en/1.6/index.html
                'orm_default' => [
                    'class_name' => \Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain::class,
                    'drivers' => [
                       'Annotation\Entity' => 'Annotation\Entity' 
                    ],
                ],
                'Annotation\Entity' => [
                    'class_name' => \Doctrine\ORM\Mapping\Driver\AnnotationDriver::class,
                    'paths' => [
                        __DIR__ . '/Annotation/Entity'
                    ]
                ],      
          
            // If you want to add a second connection
            // Php driver for example
                'orm_custom' => [
                    'class_name' => \Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain::class,
                    'drivers' => [
                        'PHPDriver\Entity' => 'PHPDriver\Entity'
                    ],
                ],
                'PHPDriver\Entity' => [
                    'class_name' => \Doctrine\Common\Persistence\Mapping\Driver\PHPDriver::class,
                    'paths' => [
                        __DIR__ . '/PHPDriver/Entity'
                    ]
                ], 
            ],
  5. 配置 doctrine 缓存
    //@see https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/caching.html
            'cache' => [
                'array' => [
                    'class_name' => Doctrine\Common\Cache\ArrayCache::class,
                    'namespace' => 'Streamcommon\Doctrine\Manager\Interop',
                ]
            ],
        ]
    ],
  6. 配置你的项目依赖
    use Streamcommon\Doctrine\Manager\Common\Factory\{
        Cache as CacheFactory,
        Driver as DriverFactory,
        EventManager as EventManagerFactory
    };
    use Streamcommon\Doctrine\Manager\DBAL\Factory\Connection as ConnectionFactory;
    use Streamcommon\Doctrine\Manager\ORM\Factory\{
        Configuration as ConfigurationFactory,
        EntityManager as EntityManagerFactory,
        EntityResolver as EntityResolverFactory,
    };
    
    'dependencies' => [
       'factories' => [
       // If you use single connection
            'doctrine.driver.orm_default'          => [DriverFactory::class, 'orm_default'],
            'doctrine.event_manager.orm_default'   => [EventManagerFactory::class, 'orm_default'],
            'doctrine.configuration.orm_default'   => [ConfigurationFactory::class, 'orm_default'],
            'doctrine.connection.orm_default'      => [ConnectionFactory::class, 'orm_default'],
            'doctrine.entity_resolver.orm_default' => [EntityResolverFactory::class, 'orm_default'],
            'doctrine.entity_manager.orm_default'  => [EntityManagerFactory::class, 'orm_default'],
            'doctrine.cache.array'                 => [CacheFactory::class, 'orm_default'],
        
       // If you want to add a second connection
            'doctrine.driver.orm_custom'          => [DriverFactory::class, 'orm_custom'],
            'doctrine.event_manager.orm_custom'   => [EventManagerFactory::class, 'orm_custom'],
            'doctrine.configuration.orm_custom'   => [ConfigurationFactory::class, 'orm_custom'],
            'doctrine.connection.orm_custom'      => [ConnectionFactory::class, 'orm_custom'],
            'doctrine.entity_resolver.orm_custom' => [EntityResolverFactory::class, 'orm_custom'],
            'doctrine.entity_manager.orm_custom'  => [EntityManagerFactory::class, 'orm_custom'],
        ],
    ]
  7. 在你的项目中使用
    $em = $container->get('doctrine.entity_manager.orm_default');
    $connection = $container->get('doctrine.connection.orm_default');

示例配置容器

Laminas 服务管理器

use Streamcommon\Doctrine\Manager\ConfigProvider;
use Laminas\ServiceManager\ServiceManager;

$config = new ConfigProvider();
$config = $config();
$dependencies = $config['dependencies'];
$dependencies['services']['config'] = $config;
return new ServiceManager($dependencies);

Symfony 容器

use JSoumelidis\SymfonyDI\Config\{Config as SymfonyConfig, ContainerFactory as SymfonyContainerFactory};
use Streamcommon\Doctrine\Manager\ConfigProvider;

$config = new ConfigProvider();
$config = $config();
$dependencies = $config['dependencies'];
$dependencies['services']['config'] = $config;
$container = new SymfonyContainerFactory();
return $container(new SymfonyConfig($dependencies))

等等...

CLI 使用

  1. 查看
  2. 对于多个连接,为 orm 命名空间添加了一个新的 --object-manager 参数
Arguments:
  --object-manager      Doctrine object manager name [default: "orm_default"]