ZF2 2.2.6 - > 2.3.0使DI尝试实例化`Zend \ I18n \ Translator \ TranslatorInterface`而不是`Zend \ I18n \ Translator \ Translator`

时间:2014-03-27 12:07:52

标签: php zend-framework2

编辑:是的,是错误。

我怀疑这是一个错误,所以我已经在https://github.com/zendframework/zf2/issues/6051将其作为一个问题提交,但为了防止它只是我愚蠢而且不会让我感到害怕这里也是。 :)


将ZF2从2.2.6升级到2.3.0后,我在Zend \ Di \ Di中收到以下一系列未被捕获的异常:

Zend\Di\Exception\RuntimeException: Invalid instantiator of type "NULL" for "Zend\I18n\Translator\TranslatorInterface". in /path/to/vendor/zendframework/zendframework/library/Zend/Di/Di.php on line 305
Zend\ServiceManager\Exception\ServiceNotCreatedException: An exception was raised while creating "Zend\I18n\Translator\TranslatorInterface"; no instance returned in /path/to/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php on line 909
Zend\ServiceManager\Exception\ServiceNotCreatedException: An abstract factory could not create an instance of zendi18ntranslatortranslatorinterface(alias: Zend\I18n\Translator\TranslatorInterface). in /path/to/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php on line 1070
Zend\ServiceManager\Exception\ServiceNotCreatedException: An exception was raised while creating "MvcTranslator"; no instance returned in /path/to/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php on line 909

不幸的是,我无法弄清楚为什么会发生这种情况,但I18n模块在升级之前工作正常。我安装并正确加载了i18n扩展。

我在module/Application/config/module.config.php

中有这个
'service_manager' => [
    'aliases' => [
        'translator' => 'MvcTranslator',
    ],
],

并在每个模块中module.config.php

'translator' => [
    'translation_file_patterns' => [
        [
            'type'     => 'gettext',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.mo',
        ],
    ],
],

到目前为止我唯一的DI配置是:

'di' => [
    'instance' => [
        'Zend\View\HelperLoader' => [
            'parameters' => [
            'map' => [
                    'zfcUserIdentity' => 'ZfcUser\View\Helper\ZfcUserIdentity',
                    'zfcUserLoginWidget' => 'ZfcUser\View\Helper\ZfcUserLoginWidget',
                ],
            ],
        ],
    ],
],

2.3.0是否添加了向DI块添加其他配置的要求,以便I18n正常工作?这并没有反映在文档中,到目前为止我还没有能够通过阅读代码来解决这个问题,但是从被抛出的异常中看起来它实际上是在尝试创建Zend\I18n\Translator\TranslatorInterface本身的实例,而不是之前的Zend\I18n\Translator\Translator实例?

有人有任何想法吗?

1 个答案:

答案 0 :(得分:1)

https://github.com/zendframework/zf2/pull/5959上找到答案:

在DiAbstractServiceFactory中,需要更改以下函数:

public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
{
    return $this->instanceManager->hasSharedInstance($requestedName)
        || $this->instanceManager->hasAlias($requestedName)
        || $this->instanceManager->hasConfig($requestedName)
        || $this->instanceManager->hasTypePreferences($requestedName)
        || $this->definitions->hasClass($requestedName);
}

为:

public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
{
    if ($this->instanceManager->hasSharedInstance($requestedName)
        || $this->instanceManager->hasAlias($requestedName)
        || $this->instanceManager->hasConfig($requestedName)
        || $this->instanceManager->hasTypePreferences($requestedName)
    ) {
        return true;
    }

    if (! $this->definitions->hasClass($requestedName) || interface_exists($requestedName)) {
        return false;
    }

    return true;
}

我相信这已被拉取请求,因此它应该包含在ZF2.3的下一次更新中。