我正在使用Doctrine2 DBAL / ORM构建Zend Framework 2(ZF2)网站,我在Windows和Mac上平均开发,有时是Linux(Ubuntu)(我喜欢全面的体验)。
在composer.json
我有以下版本:
起初,我的网站在使用XAMPP(Apache 2.4.16,MySQL 5.0.11和PHP 5.6.12)的所有三种环境中运行良好。但突然之间,我在Windows上执行了一些更改并将这些更改从GitHub移到我的Mac计算机后,Doctrine开始失败并显示以下异常消息:
An exception was raised while creating "Doctrine\ORM\EntityManager"; no instance returned
在ZF2中配置Doctrine2时,我遇到了很多这样的异常。但是一旦我完成了,事情就会奏效。直到它在Mac上崩溃,只有!它在Windows上仍然可以正常工作。
我已经完全清除了缓存(rm data/cache/*
)并验证了配置文件的完整性。 Windows和Mac之间配置的唯一区别是我为MySQL提供了unix_socket
路径(见下文)。
我的config/application.php
:
<?php
return array(
'modules' => array(
// ...
'DoctrineModule',
'DoctrineORMModule',
),
'module_listener_options' => array(
// ...
),
);
我的config/autoload/databases.local.php
看起来像这样(更改了数据库服务器登录信息的值):
<?php
return array(
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
'params' => array(
'unix_socket' => '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock', // This is for Mac
'host' => 'some_host',
'port' => '3306',
'user' => 'some_user',
'password' => 'some_password',
'dbname' => 'some_database',
)
)
),
'configuration' => array(
'orm_default' => array(
'proxy_dir' => 'core/server/data/DoctrineORMModule/Proxy',
'proxy_namespace' => 'DoctrineORMModule\Proxy',
)
)
),
);
如上所述,这些配置适用于Windows(我可以检索和使用EntityManager),并且是我的Mac解决方案的1:1镜像。那会发生什么?
当我在Mac上检查缓存的配置文件data/cache/module-config-cache.application.config.cache.php
时,数据库登录信息不正确,具有以下值:
// ...
array (
'host' => 'localhost',
'port' => '3306',
'user' => 'username',
'password' => 'password',
'dbname' => 'database',
),
// ...
显然这些都是错的。但ZF2如何突然在Mac上生成错误的配置?
我甚至尝试在我的Mac上检查以前从Git提交的提交,我知道这些提交肯定有效。但同样的问题发生了。我怀疑可能对这种行为产生影响的唯一区别是,我运行了composer.phar update
,这可能已经改变了ZF2和/或Doctrine2的版本。
答案 0 :(得分:1)
问题归结为自动加载配置文件的glob模式不正确。
$appConfig['module_listener_options']['config_glob_paths'][$index] = getcwd() . '/' . $path;
getcwd()
指针不正确,尽管指定了以下内容:
define('ROOT_PATH', realpath(__DIR__ . '/../../../..'));
chdir(ROOT_PATH);
由于某种原因,我无法理解,它在Windows和Ubuntu之前有效,但在Mac上无效。现在它适用于所有三种环境。
这是一个几乎不可见的错误,需要通过引导逻辑进行逐行调试。
答案 1 :(得分:0)
在我的情况下,当数据库丢失时,抛出了此错误消息!