Php ZF3转换器远程加载程序工厂无法解析服务

Php ZF3转换器远程加载程序工厂无法解析服务,php,zend-framework3,zend-translate,zend-servicemanager,Php,Zend Framework3,Zend Translate,Zend Servicemanager,我在使用MVCTranslator时遇到问题,数据库中存储了翻译。 我已将翻译配置为使用远程_翻译,但无法为自定义加载程序创建工厂。 我的文件如下所示: module.config.php Module.php Translator\DatabaseTranslationLoader.php Factory\DatabaseTranslationLoaderFactory.php 使用此配置,当我尝试在DatabaseTranslationLoaderFactory中检索数据库适配器时,会收到来


我在使用MVCTranslator时遇到问题,数据库中存储了翻译。

我已将翻译配置为使用远程_翻译,但无法为自定义加载程序创建工厂。 我的文件如下所示:

module.config.php

Module.php

Translator\DatabaseTranslationLoader.php

Factory\DatabaseTranslationLoaderFactory.php

使用此配置,当我尝试在DatabaseTranslationLoaderFactory中检索数据库适配器时,会收到来自服务管理器的异常:

无法将服务“Zend\Db\Adapter\Adapter”解析为工厂;您确定在配置过程中提供了它吗

工厂似乎有一个空容器(新的ServiceManager实例?)

我做错了什么? 有人知道怎么做吗? 如有任何建议,我将不胜感激

编辑:

如上所述,这似乎是DatabaseTranslationLoaderFactory中的一个新serviceMenager实例。
当我尝试执行以下操作时会出现相同的错误:

$container->get('router')


首先,我看到你打电话时打错了。您可以调用变量
$contenner
。它应该是
$container

$conteiner->get('Zend\Db\Adapter\Adapter')
和用于检索数据库适配器服务的使用

$container->get(Zend\Db\Adapter\AdapterInterface::class);
而不是

$container->get('Zend\Db\Adapter\Adapter')

首先,我看到你打电话时打错了。您可以调用变量
$contenner
。它应该是
$container

$conteiner->get('Zend\Db\Adapter\Adapter')
和用于检索数据库适配器服务的使用

$container->get(Zend\Db\Adapter\AdapterInterface::class);
而不是

$container->get('Zend\Db\Adapter\Adapter')

经过数小时的搜索,我找到了问题的解决方案。
在Zend\I18n\Translator\Translator.php中找到了问题的解释:

从上面可以看出,默认情况下,getPluginManager使用ServiceManager的新实例创建一个新的LoaderPluginManager实例

在我的例子中,要访问DatabaseTranslationLoaderFactory中的ServiceManager,我必须首先使用setPluginManager方法,如下所示:

Module.php

我不知道这个解决方案是否正确,但它是有效的

也许它会帮助某人:)

经过几个小时的搜索,我找到了解决问题的方法。
在Zend\I18n\Translator\Translator.php中找到了问题的解释:

从上面可以看出,默认情况下,getPluginManager使用ServiceManager的新实例创建一个新的LoaderPluginManager实例

在我的例子中,要访问DatabaseTranslationLoaderFactory中的ServiceManager,我必须首先使用setPluginManager方法,如下所示:

Module.php

我不知道这个解决方案是否正确,但它是有效的

也许这会对某人有所帮助:)

谢谢你的评论。我已经包括了你的建议,但我仍然有同样的错误。你有什么想法吗?我的想法已经用尽了:/您的
db
配置如何?您配置了吗?是的,我已经配置了数据库的连接参数,我确信这很好,因为它在另一个工厂中使用了这些参数。一般来说,我不能在这家工厂使用任何服务。关键是,为了使这个工厂能够工作,我必须通过以下方式添加它:
$translator->getPluginManager()->>setFactory(translator\DatabaseTranslationLoader::class,factory\DatabaseTranslationLoaderFactory::class)
,否则它就无法工作。也许有什么不对劲?也许我应该换一种方式?谢谢你的评论。我已经包括了你的建议,但我仍然有同样的错误。你有什么想法吗?我的想法已经用尽了:/您的
db
配置如何?您配置了吗?是的,我已经配置了数据库的连接参数,我确信这很好,因为它在另一个工厂中使用了这些参数。一般来说,我不能在这家工厂使用任何服务。关键是,为了使这个工厂能够工作,我必须通过以下方式添加它:
$translator->getPluginManager()->>setFactory(translator\DatabaseTranslationLoader::class,factory\DatabaseTranslationLoaderFactory::class)
,否则它就无法工作。也许有什么不对劲?也许我应该换一种方式做?
$container->get(Zend\Db\Adapter\AdapterInterface::class);
$container->get('Zend\Db\Adapter\Adapter')
public function setPluginManager(LoaderPluginManager $pluginManager)
{
    $this->pluginManager = $pluginManager;

    return $this;
}

public function getPluginManager()
{
    if (! $this->pluginManager instanceof LoaderPluginManager) {
        $this->setPluginManager(new LoaderPluginManager(new ServiceManager));
    }

    return $this->pluginManager;
}
namespace MyNamespace;

use Zend\ModuleManager\Feature\ConfigProviderInterface;

class Module implements ConfigProviderInterface
{
    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }

    /*
    ....
    ...
    ....
    */      

    public function getControllerConfig()
    {        
        return [
            'factories' => [
                Controller\MyController::class => function($container) {                   

                    $translator = $container->get('MvcTranslator');  

                    // This line solved my problem
                    $translator->setPluginManager(new \Zend\I18n\Translator\LoaderPluginManager($container));

                    $translator->getPluginManager()->setFactory(Translator\DatabaseTranslationLoader::class, Factory\DatabaseTranslationLoaderFactory::class); 

                    return new Controller\MyController(
                        $translator
                    );
                },
            ],
        ];
    }
}