我正在从 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,
),
),
),
),
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(); } }
应用程序\模块.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