【问题标题】:ZF2+Doctrine2 - Suddenly getting error on Mac: "Doctrine\ORM\EntityManager"; no instance returnedZF2+Doctrine2 - 在 Mac 上突然出现错误:“Doctrine\ORM\EntityManager”;没有返回实例
【发布时间】:2015-10-02 09:12:20
【问题描述】:

我正在使用 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,

起初,我的网站在所有三个使用 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_socketpath(见下文)。

我的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 的版本。

【问题讨论】:

  • 您是否尝试通过运行orm:generate-proxies 重新生成代理?
  • @StoryTeller 我也从data 文件夹(data/DoctrineORMModule/Proxy) 中删除了代理。它甚至没有生成它们。

标签: php macos doctrine-orm zend-framework2


【解决方案1】:

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

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

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

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

由于某种原因,我无法理解,它以前在 Windows 和 Ubuntu 上工作过,但在 Mac 上却不行。现在它适用于所有三种环境。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 2012-08-01
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多