Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 原则2,从PDO创建EntityManager-错误_Php_Pdo_Doctrine Orm_Entitymanager - Fatal编程技术网

Php 原则2,从PDO创建EntityManager-错误

Php 原则2,从PDO创建EntityManager-错误,php,pdo,doctrine-orm,entitymanager,Php,Pdo,Doctrine Orm,Entitymanager,我有以下情况: class ModelManager extends EntityManager implements ModelManagerInterface { public function __construct($conn, $options = array()) { $isDev = empty($options['is_dev']) ? false : $options['is_dev']; // @see Doctrine\O

我有以下情况:

class ModelManager extends EntityManager implements ModelManagerInterface
{

    public function __construct($conn, $options = array())
    {
        $isDev = empty($options['is_dev']) ? false : $options['is_dev'];

        // @see Doctrine\ORM\EntityManager#create()
        $config = ArrayUtils::arrayMergeRecursiveRight($options, array(
            'cache' => $isDev ? new Cache\ArrayCache : new Cache\ApcCache,
            'queryCache' => $isDev ? new Cache\ArrayCache : new Cache\ApcCache,
            'modelsProxiesPath' => getcwd() . '/cache/ModelProxies',
        ));

        // create Configuration object
        if (is_array($options)) {
            $config = $this->initConfig($options);
            if (!$config->getMetadataDriverImpl()) {
                throw ORMException::missingMappingDriverImpl();
            }
        }

        // test EventManager object
        $eventManager = empty($options['eventManager']) ? new EventManager() : $options['eventManager'];

        switch (true) {
            case ($conn instanceof \PDO):
                $conn = array(
                    'driver' => 'pdo_' . $conn->getAttribute(\PDO::ATTR_DRIVER_NAME),
                    'pdo' => $conn,
                );
                print_r($conn);
                $conn = \Doctrine\DBAL\DriverManager::getConnection($conn, $config, $eventManager);
                break;

            case (is_string($conn)):
                $pdo = new \PDO($conn);
                if ('oci8' !== $pdo->getAttribute(\PDO::ATTR_DRIVER_NAME)) {
                    $conn = array(
                        'driver' => 'pdo_' . $pdo->getAttribute(\PDO::ATTR_DRIVER_NAME),
                        'pdo' => $pdo,
                    );
                } else {
                    $conn = $this->mapDsnToDoctrine($conn);
                }
                $conn = \Doctrine\DBAL\DriverManager::getConnection($conn, $config, $eventManager);
                break;

            case (is_array($conn)):
                $conn = \Doctrine\DBAL\DriverManager::getConnection($conn, $config, $eventManager);
                break;

            case ($conn instanceof Connection):
                if ($eventManager !== null && $conn->getEventManager() !== null) {
                    throw ORMException::mismatchedEventManager();
                }
                break;

            default:
                throw new Exception\InvalidArgument("Invalid argument: " . json_encode($conn));
        }

        // parent constructor
        // @see Doctrine\ORM\EntityManager#__construct()
        parent::__construct($conn, $config, $conn->getEventManager());
    }
// ...
}
这是用于smth的,如下所示:

self::$em = new ModelManager(
    new \PDO(self::$config['db_adapter']['connection']['dsn']),
    empty(self::$config['db_adapter']['options']['doctrine']) ?
        array() : self::$config['db_adapter']['options']['doctrine']
);

$tool = new \Doctrine\ORM\Tools\SchemaTool(self::$em);
$classes = $this->db(self::$config['db_adapter']['options']['doctrine']['modelsPath']);
$tool->updateSchema($classes);
$config = array(
    'db_adapter' => array(
        'connection' => array(
            'dsn' => 'mysql://root:******@localhost/netistest' . time(),
        ),
        'options' => array(
            'doctrine' => array(
                'cache' => 'ArrayCache|ApcCache', // development|testing&production
                'queryCache' => 'ArrayCache|ApcCache', // development|testing&production
                'modelsPath' => __DIR__ . '/NetisTest/Model',
                'modelsProxiesPath' => __DIR__ . '/cache/doctrine/ModelProxies',
                'modelsProxiesNamespace' => 'App\Models\Proxies',
                'modelsProxiesAutogenerate' => 'App\Models\Proxies',
            ),
            'zend' => array(
                // at this moment we decided not to implement Zend\DbAdapter
            ),
        )
    ),
);
配置如下所示:

self::$em = new ModelManager(
    new \PDO(self::$config['db_adapter']['connection']['dsn']),
    empty(self::$config['db_adapter']['options']['doctrine']) ?
        array() : self::$config['db_adapter']['options']['doctrine']
);

$tool = new \Doctrine\ORM\Tools\SchemaTool(self::$em);
$classes = $this->db(self::$config['db_adapter']['options']['doctrine']['modelsPath']);
$tool->updateSchema($classes);
$config = array(
    'db_adapter' => array(
        'connection' => array(
            'dsn' => 'mysql://root:******@localhost/netistest' . time(),
        ),
        'options' => array(
            'doctrine' => array(
                'cache' => 'ArrayCache|ApcCache', // development|testing&production
                'queryCache' => 'ArrayCache|ApcCache', // development|testing&production
                'modelsPath' => __DIR__ . '/NetisTest/Model',
                'modelsProxiesPath' => __DIR__ . '/cache/doctrine/ModelProxies',
                'modelsProxiesNamespace' => 'App\Models\Proxies',
                'modelsProxiesAutogenerate' => 'App\Models\Proxies',
            ),
            'zend' => array(
                // at this moment we decided not to implement Zend\DbAdapter
            ),
        )
    ),
);
所有这些奇怪配置的问题在于,在实例化ModelManager类之后,当试图查询数据库以创建与我的模型关联的表时,它抛出以下错误:

Doctrine\DBAL\DBALException: An exception occurred while executing 'SHOW FULL TABLES WHERE Table_type = 'BASE TABLE'':

SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected

/home/dragosc/workspace/athem-repositories/Component_NetisDb/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:91
/home/dragosc/workspace/athem-repositories/Component_NetisDb/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:699
/home/dragosc/workspace/athem-repositories/Component_NetisDb/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:630
/home/dragosc/workspace/athem-repositories/Component_NetisDb/vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php:206
/home/dragosc/workspace/athem-repositories/Component_NetisDb/vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php:250
/home/dragosc/workspace/athem-repositories/Component_NetisDb/vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php:986
/home/dragosc/workspace/athem-repositories/Component_NetisDb/vendor/doctrine/orm/lib/Doctrine/ORM/Tools/SchemaTool.php:855
/home/dragosc/workspace/athem-repositories/Component_NetisDb/vendor/doctrine/orm/lib/Doctrine/ORM/Tools/SchemaTool.php:832
/home/dragosc/workspace/athem-repositories/Component_NetisDb/tests/NetisTest/Db/Setup/Doctrine.php:51
您也可以在此处找到代码(不过是较旧的形式):

有谁能帮助我理解为什么PDO不足以让EntityManager记住数据库


提前多谢

你的DSN看起来不对劲。请参阅EntityManager不是为扩展而设计的。我怀疑您可以将功能移到自定义存储库。但是,如果您决定扩展EntityManager,请将静态工厂方法EntityManager::create复制到您的ModelManager并进行调整。@Phil当我编写DSN解析器时,我首先看了这里:它似乎只适用于PEAR::DB。@Cerad,是的,您可以扩展该类;它实际上更像是一个包装器,是的,我确实从EntityManager::create复制了代码。问题是不同的;请参阅对Phil的评论。感谢您提供的信息。非常有用:D。