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
我有以下版本:
- "doctrine/doctrine-orm-module": "^0.9.1"
- "zendframework/zendframework": ">=2.3.2,<3.0.0"
起初,我的网站 运行 在使用 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 上无效。现在它适用于所有三种环境。
这是一个几乎不可见的错误,需要通过引导逻辑逐行调试。
在我的例子中,这条错误消息是在数据库丢失时抛出的!
我正在使用 Doctrine2 DBAL/ORM 构建 Zend Framework 2 (ZF2) 网站,我在 Windows 和 Mac 上进行同等开发,有时 Linux( Ubuntu)(我喜欢全方位的体验)
在composer.json
我有以下版本:
- "doctrine/doctrine-orm-module": "^0.9.1"
- "zendframework/zendframework": ">=2.3.2,<3.0.0"
起初,我的网站 运行 在使用 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 上无效。现在它适用于所有三种环境。
这是一个几乎不可见的错误,需要通过引导逻辑逐行调试。
在我的例子中,这条错误消息是在数据库丢失时抛出的!