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

本杰明·诺兰(Benjamin Nolan)

编辑:是的,是bug。

我怀疑这是一个错误,因此我已将其作为问题提交至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它自己。以前做过?

任何人有任何想法吗?

本杰明·诺兰(Benjamin Nolan)

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的下一次更新中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档