ZendFramework 3 remote_translation from Database Translation



我正在从 ZF2 迁移到 ZF3,完全安装了 PHP7.0 和 ZF3 成功。 将 ZF2 代码库放入 ZF3 框架中,并通过 json 安装所有依赖项。 现在我面临与数据库翻译相关的问题。 我面临的错误是

谁能帮我

致命错误:未捕获的 Zend\ServiceManager\Exception\ServiceNotFoundException:在插件管理器 Zend\I18n\Translator\LoaderPluginManager 中找不到名为"database"的插件/var/www/html/skeleton-application/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php:131 堆栈跟踪:

在 ZF2 中,我实现了 DB Translations。

1(应用程序/模块配置.php作为

'translator' => array(
'loaderpluginmanager' => array(
'factories' => array(
'database' => 'CharanI18nTranslatorLoaderDatabaseTranslatorFactory',
),
),
'locale' => 'en_US',
'remote_translation' => array(
array(
'type' => 'database',
),
),
'cache' => array(
'adapter' => array(
'name' => 'Filesystem',
'options' => array(
'cache_dir' => __DIR__.'/../../../../../data/cache',
'ttl' => '3600',
'namespace' => Charan::config()->site->slug
),
),
'plugins' => array(
array(
'name' => 'serializer',
'options' => array(),
),
'exception_handler' => array(
'throw_exceptions' => true,
),
),
),
),
  1. Charan\library\core\I18n\Translator\Loader\DatabaseTranslatorFactory.php as

    命名空间 Charan\I18n\Translator\Loader;

    use ZendServiceManagerFactoryInterface;
    use ZendServiceManagerServiceLocatorInterface;
    class DatabaseTranslatorFactory implements FactoryInterface
    {
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
    return new DatabaseTranslator();
    }
    }
    
  2. 应用程序\模块.php如下所示

    public function onBootstrap(MvcEvent $e){
    // Set the application variable
    $app = $e->getApplication();
    // Set the event and service manager variables
    $eventManager = $app->getEventManager();
    $serviceManager = $app->getServiceManager();
    $adapter = $serviceManager->get('ZendDbAdapterAdapter');
    ZendDbTableGatewayFeatureGlobalAdapterFeature::setStaticAdapter($adapter);
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    // Add the TemplateInjector class to use custom layouts
    $eventManager->getSharedManager()
    ->attach(
    'ZendStdlibDispatchableInterface',
    MvcEvent::EVENT_DISPATCH,
    new TemplateInjector(),
    -91
    );
    $this->initAcl($e);
    $e->getApplication()
    ->getEventManager()
    ->attach('route', array($this, 'checkAcl'));
    $e->getApplication()
    ->getEventManager()
    ->getSharedManager()
    ->attach('*', 'route', array($this, 'validateUrl'));
    $eventManager->attach('finish', array($this, 'compressOutput'), 100);
    // Set static adapter for all modules
    $dbAdapter = $serviceManager->get('ZendDbAdapterAdapter');
    GlobalAdapterFeature::setStaticAdapter($dbAdapter);
    

    }

    public function getServiceConfig()
    {
    return array(
    'factories' => array(
    'MvcTranslator' => 'CharanMvcServiceTranslatorServiceFactory',
    'StringSanitizer' => function ($sm) {
    $helper = new Helper();
    return $helper->getStringSanitizer();
    },
    'NumericStringSanitizer' => function ($sm) {
    $helper = new Helper();
    return $helper->getNumericStringSanitizer();
    },
    'EmailSanitizer' => function ($sm) {
    $helper = new Helper();
    return $helper->getEmailSanitizer();
    },
    'ZendDbAdapterAdapter' => function($serviceManager) {
    if (Charan::isDevelopment()) {
    $adapter = new ProfilingAdapter(array(
    'driver'    => 'Pdo',
    'dsn'       => 'mysql:dbname=' . Charan::config()->database->name . ';host=' . Charan::config()->database->host,
    'database'  => Charan::config()->database->name,
    'username'  => Charan::config()->database->username,
    'password'  => Charan::config()->database->password,
    'hostname'  => Charan::config()->database->host
    ));
    if (Cli::isCli()) {
    $logger = new Logger();
    $writer = new Stream('php://output');
    $logger->addWriter($writer, Logger::DEBUG);
    $adapter->setProfiler(new LoggingProfiler($logger));
    } else {
    $adapter->setProfiler(new Profiler());
    }
    if (isset($databaseParameters['options']) && is_array($databaseParameters['options'])) {
    $options = $databaseParameters['options'];
    } else {
    $options = array();
    }
    $adapter->injectProfilingStatementPrototype($options);
    } else {
    $adapterFactory = new AdapterServiceFactory();
    $adapter = $adapterFactory->createService($serviceManager);
    }
    GlobalAdapterFeature::setStaticAdapter($adapter);
    return $adapter;
    },
    'translator' => function (ZendServiceManagerServiceManager $serviceManager) {
    $pluginManager = new ZendI18nTranslatorLoaderPluginManager();
    $pluginManager->setServiceLocator($serviceManager);
    $pluginManager->setFactory('DatabaseTranslatorFactory', function ($serviceManager) {
    $translator = new CharanI18nTranslatorLoaderDatabaseTranslatorFactory();
    return $translator->createService($serviceManager);
    });
    $translator = new CharanI18nTranslatorTranslator(array());
    $translator->setFallbackLocale('en_GB');
    $translator->setPluginManager($pluginManager);
    $translator->addRemoteTranslations('DatabaseTranslatorFactory');
    return $translator;
    },
    ),
    );
    }
    

快速猜测是您忘记将工厂从 ZF2 迁移到 ZF3 兼容,因此无法创建插件。ZF3 中工厂接口的签名已更改,必须更新所有工厂才能正常工作。查看此链接以获取更多信息: https://zendframework.github.io/zend-servicemanager/migration/#factoryinterface

最新更新