ZF2 + Doctrine2 - 在Mac上突然出现错误:" Doctrine \ ORM \ EntityManager&#34 ;;没有实例返回

时间:2015-10-02 09:12:20

标签: php macos doctrine-orm zend-framework2

我正在使用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和/或Doctrine2的版本。

2 个答案:

答案 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)

在我的情况下,当数据库丢失时,抛出了此错误消息!