0


我在将 MVCTranslator 与存储在数据库中的翻译一起使用时遇到问题。

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

模块.config.php

'translator' => [                
    'locale' => 'en_US',
    'translation_file_patterns' => [
        [
            'type'     => 'phparray',
            'base_dir' => getcwd() .  '/data/language',
            'pattern'  => '%s.php',
            'text_domain' => 'default',
        ],             
    ],        
    'remote_translation' => [
        [                
            'type' => Model\DatabaseTranslationLoader::class,
            'text_domain' => 'default',                
        ]
    ],

],

模块.php

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');                    

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

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

}

Translator\DatabaseTranslationLoader.php

namespace MyNamespace\Translator;

use Zend\Db\Adapter\Adapter as DbAdapter;
use Zend\I18n\Translator\Loader\RemoteLoaderInterface;

class DatabaseTranslationLoader implements RemoteLoaderInterface
{
    protected $dbAdapter;

    public function __construct(DbAdapter $adapter)
    {        
        $this->dbAdapter = $adapter;
    }

    public function load($locale, $filename)
    {
        // Database operations
    }

工厂\DatabaseTranslationLoaderFactory.php

namespace MyNamespace\Factory\DatabaseTranslation;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;   

class DatabaseTranslationLoaderFactory implements FactoryInterface
{       
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $dbAdapter = $container->get(Zend\Db\Adapter\AdapterInterface:class);           

        return new Translator\DatabaseTranslationLoader($dbAdapter);
    }
}

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

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

看起来工厂有一个空容器(一个新的 ServiceManager 实例?)。

我究竟做错了什么?有谁知道如何做到这一点?我将不胜感激任何建议。

编辑:

如上所述,看起来这是 DatabaseTranslationLoaderFactory 中的一个新 serviceMenager 实例。
当我尝试做同样的错误时:

$container->get('router')

或者

$container->get('request')
4

2 回答 2

1

首先,我看到您在调用服务时输入错误。你叫变量$conteiner。应该是$container

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

并用于检索数据库适配器服务

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

代替

$container->get('Zend\Db\Adapter\Adapter')
于 2017-07-29T23:48:09.193 回答
1

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

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;
}

从上面可以看出,getPluginManager 默认会创建一个新的 LoaderPluginManager 实例和一个新的 ServiceManager 实例。

就我而言,要访问 DatabaseTranslationLoaderFactory 中的 ServiceManager,我必须首先使用 setPluginManager 方法,如下所示:

模块.php

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
                    );
                },
            ],
        ];
    }
}

我不知道这个解决方案是否正确,但它有效。
也许它会帮助某人:)

于 2017-08-07T09:13:15.810 回答