php Zend Framework 2和Doctrine 2 -配置多个数据库

aelbi1ox  于 2023-11-16  发布在  PHP
关注(0)|答案(3)|浏览(144)

我将configuration.md文件中的代码粘贴到
module.config.php

'doctrine' => array(
        'connection' => array(
            'orm_crawler' => array(
                'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
                'params' => array(
                    'host'     => 'localhost',
                    'port'     => '3306',
                    'user'     => 'root',
                    'password' => 'root',
                    'dbname'   => 'crawler',
                    'driverOptions' => array(
                        1002 => 'SET NAMES utf8'
                    ),
                )
            )
        ),

        'configuration' => array(
            'orm_crawler' => array(
                'metadata_cache'    => 'array',
                'query_cache'       => 'array',
                'result_cache'      => 'array',
                'driver'            => 'orm_crawler',
                'generate_proxies'  => true,
                'proxy_dir'         => 'data/DoctrineORMModule/Proxy',
                'proxy_namespace'   => 'DoctrineORMModule\Proxy',
                'filters'           => array()
            )
        ),

        'driver' => array(
            'Crawler_Driver' => array(
                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                'cache' => 'array',
                'paths' => array(
                    __DIR__ . '/../src/Crawler/Entity'
                )
            ),
            'orm_crawler' => array(
                'class'   => 'Doctrine\ORM\Mapping\Driver\DriverChain',
                'drivers' => array(
                    'Crawler\Entity' =>  'Crawler_Driver'
                )
            ),
        ),

        'entitymanager' => array(            
            'orm_crawler' => array(
                'connection'    => 'orm_crawler',
                'configuration' => 'orm_crawler'
            )
        ),

        'eventmanager' => array(
            'orm_crawler' => array()
        ),

        'sql_logger_collector' => array(
            'orm_crawler' => array(),
        ),

        'entity_resolver' => array(
            'orm_crawler' => array()
        ),

    ),

字符串
Module.php

public function getServiceConfig()
{
    return array(
        'factories' => array(
'doctrine.authenticationadapter.orm_crawler'  => new \DoctrineModule\Service\Authentication\AdapterFactory('orm_crawler'),
                'doctrine.authenticationstorage.orm_crawler'  => new \DoctrineModule\Service\Authentication\StorageFactory('orm_crawler'),
                'doctrine.authenticationservice.orm_crawler'  => new \DoctrineModule\Service\Authentication\AuthenticationServiceFactory('orm_crawler'),

                'doctrine.connection.orm_crawler'             => new \DoctrineORMModule\Service\DBALConnectionFactory('orm_crawler'),
                'doctrine.configuration.orm_crawler'          => new \DoctrineORMModule\Service\ConfigurationFactory('orm_crawler'),
                'doctrine.entitymanager.orm_crawler'          => new \DoctrineORMModule\Service\EntityManagerFactory('orm_crawler'),

                'doctrine.driver.orm_crawler'                 => new \DoctrineModule\Service\DriverFactory('orm_crawler'),
                'doctrine.eventmanager.orm_crawler'           => new \DoctrineModule\Service\EventManagerFactory('orm_crawler'),
                'doctrine.entity_resolver.orm_crawler'        => new \DoctrineORMModule\Service\EntityResolverFactory('orm_crawler'),
                'doctrine.sql_logger_collector.orm_crawler'   => new \DoctrineORMModule\Service\SQLLoggerCollectorFactory('orm_crawler'),
                'doctrine.mapping_collector.orm_crawler'      => function (\Zend\ServiceManager\ServiceLocatorInterface $sl) {
                    $em = $sl->get('doctrine.entitymanager.orm_crawler');

                    return new \DoctrineORMModule\Collector\MappingCollector($em->getMetadataFactory(), 'orm_crawler_mappings');
                },
                'DoctrineORMModule\Form\Annotation\AnnotationBuilder' => function(\Zend\ServiceManager\ServiceLocatorInterface $sl) {
                    return new \DoctrineORMModule\Form\Annotation\AnnotationBuilder($sl->get('doctrine.entitymanager.orm_crawler'));
                },
        ),
    );
}


我得到以下错误:

C:\xampp\vhosts\zf2-trade\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php:529


留言内容:

Zend\Mvc\Controller\PluginManager::get was unable to fetch or create an instance for getServiceManager


我做错了什么?

2w2cym1i

2w2cym1i1#

您不需要为每个连接分别定义自定义工厂。DoctrineORMModule已经为我们处理了这项工作。
当您需要实体管理器时,通过在别名中使用它们的名称从服务定位器示例中获取它,如下所示:

$this->getServiceLocator()->get('doctrine.entitymanager.orm_default');

字符串

$this->getServiceLocator()->get('doctrine.entitymanager.orm_alternative');


我正在分享我当前应用程序的一个数据库配置,该数据库当前使用PostgreSQL和MySQL连接。

<?php
return array(
    'doctrine' => array(
        'connection' => array(
            // Default DB connection
            'orm_default' => array(
                'driverClass' => 'Doctrine\DBAL\Driver\PDOPgSql\Driver',
                'params' => array(
                    'host' => '1.2.3.4',
                    'user' => 'pdbuser',
                    'port' => '5432',
                    'password' => '****',
                    'dbname' => 'mydb',
                    'driver' => 'pdo_pgsql',
                ),
            ),

            // Alternative DB connection
            'orm_alternative' => array(
                'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
                'params' => array(
                    'host' => '4.5.6.7',
                    'user' => 'dbuser',
                    'port' => '3306',
                    'password' => '****',
                    'dbname' => 'mydb',
                    'driver' => 'pdo_mysql',
                ),
            ),
        ),

        // Entity Manager instantiation settings
        'entitymanager' => array(
            'orm_default' => array(
                'connection'    => 'orm_default',
                'configuration' => 'orm_default',
            ),
            'orm_alternative' => array(
                'connection'    => 'orm_alternative',
                'configuration' => 'orm_alternative',
            ),
        ),

        // Use array cache locally, also auto generate proxies on development environment.
        'configuration' => array(
            'orm_default' => array(
                'metadata_cache' => 'array',
                'query_cache' => 'array',
                'result_cache' => 'array',
                'hydration_cache' => 'array',
                'generate_proxies' => true,
            ),
            'orm_alternative' => array(
                'metadata_cache' => 'array',
                'query_cache' => 'array',
                'result_cache' => 'array',
                'hydration_cache' => 'array',
                'generate_proxies' => true,
            ),
        ),
    ),
);


您可以轻松地将此配置与您的配置合并。

t0ybt7op

t0ybt7op2#

@edigu answer工作正常,但在某些情况下,它会给出“以下错误:Zend\ServiceManager\ServiceManager::get无法获取或创建doctrine.connection. crawle的示例”
因此,为了解决这个问题,我们可以在实体管理器设置中进行更改

'entitymanager' => array(
        'orm_default' => array(
            'connection'    => 'orm_default',
            'configuration' => 'orm_default',
        ),
        'orm_alternative' => array(
            'connection'    => 'orm_alternative',
            'configuration' => 'orm_default',  //<--use parent configurations 
        ),
    ),

字符串
用于必要检查here

mfuanj7w

mfuanj7w3#

@foozy:这正是我在寻找的。与

./vendor/bin/doctrine-module orm:schema-tool:update --force

字符串
您现在可以更新或创建数据库模式。
我的问题是:如何定义应该在哪个数据库中创建哪个实体?

相关问题