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。