ZF2+Doctrine2 - Mac 突然出错:"Doctrine\ORM\EntityManager";没有返回实例

ZF2+Doctrine2 - Suddenly getting error on Mac: "Doctrine\ORM\EntityManager"; no instance returned

我正在使用 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 and/or Doctrine2.

的版本

问题归结为自动加载配置文件的 glob 模式不正确。

$appConfig['module_listener_options']['config_glob_paths'][$index] = getcwd() . '/' . $path;

getcwd() 的指针不正确,尽管指定了以下内容:

define('ROOT_PATH', realpath(__DIR__ . '/../../../..'));
chdir(ROOT_PATH);

出于某种原因我无法理解,它之前在 Windows 和 Ubuntu 上有效,但在 Mac 上无效。现在它适用于所有三种环境。

这是一个几乎不可见的错误,需要通过引导逻辑逐行调试。

在我的例子中,这条错误消息是在数据库丢失时抛出的!