【问题标题】:ZF2 ServiceManager is unable to create doctrine.entitymanager.orm_defaultZF2 ServiceManager 无法创建教义.entitymanager.orm_default
【发布时间】:2016-05-20 19:14:22
【问题描述】:

当我尝试在 ZF2 中使用学说 2 时,出现以下错误。

Zend\ServiceManager\ServiceManager::get 无法获取或创建理论.entitymanager.orm_default 的实例

包含并激活了所需的模块。

doctrine.config.local.php

return [
    'doctrine' => [
        'connection' => [
            'orm_default' => [
                'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
                'params' => [
                    'host' => 'localhost',
                    'port' => '3306',
                    'user' => 'root',
                    'password' => 'password',
                    'dbname' => 'database',
                    'charset' => 'utf8',
                    'driverOptions' => [
                        1002 => 'SET NAMES utf8'
                  ],
                ],
             ],
        ],

        'configuration' => [
            'orm_default' => [
                'metadata_cache' => 'array',
                'query_cache' => 'array',
                'result_cache' => 'array',
                'hydration_cache' => 'array',

                'generate_proxies' => false,
            ]
        ]
    ]
];

module.config.php核心模块(/module/Core/config/module.config.php)

namespace Core;

return [
    'service_manager' => include __DIR__ . '/service-manager.config.php',
    'router' => include __DIR__ . '/router.config.php',
    'view_manager' => include __DIR__ . '/view-manager.config.php',
    'translator' => include __DIR__ . '/translator.config.php',
    'hydrators' => include __DIR__ . '/hydrators.config.php'
];

doctrine.config.php核心模块(/module/Core/config/doctrine.config.php)

return [
    'driver' => [
        __NAMESPACE__ . '_driver' => [
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => [
                __DIR__ . '/../src/' . __NAMESPACE__ . '/Entity',
            ]
        ],
        'orm_default' => [
            'drivers' => [
                __NAMESPACE__ => __NAMESPACE__ . '_driver'
            ]
        ]
    ]
];

工厂

namespace Event\Form\Fieldset\Factory;

use Event\Entity\Event;
use Event\Form\Fieldset\EventFieldset;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class EventFieldsetFactory implements FactoryInterface {

    public function createService(ServiceLocatorInterface $formElementManager) {
        $serviceLocator = $formElementManager->getServiceLocator();
        $hydratorManager = $serviceLocator->get('HydratorManager');

        // Here I get the error!
        $objectManager = $serviceLocator->get('Doctrine\ORM\EntityManager');

        $fieldset = new EventFieldset();
        $fieldset->setObjectManager($objectManager);
        $fieldset->setHydrator($hydratorManager->get('Core\Hydrator\Doctrine'));
        $fieldset->setObject(new Event());

        return $fieldset;
    }

}

模块 in application.config.php

'modules' => [
    'DoctrineModule',
    'DoctrineORMModule',
    'Core',
    'Event',
    'Inquiry'
]

堆栈跟踪

Zend\ServiceManager\Exception\ServiceNotFoundException

文件:

/src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php:555

消息:

Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for doctrine.entitymanager.orm_default

堆栈跟踪:

#0 /src/vendor/doctrine/doctrine-orm-module/src/DoctrineORMModule/Service/EntityManagerAliasCompatFactory.php(44): Zend\ServiceManager\ServiceManager->get('doctrine.entity...')
#1 [internal function]: DoctrineORMModule\Service\EntityManagerAliasCompatFactory->createService(Object(Zend\ServiceManager\ServiceManager), 'doctrineormenti...', 'Doctrine\ORM\En...')
#2 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(934): call_user_func(Array, Object(Zend\ServiceManager\ServiceManager), 'doctrineormenti...', 'Doctrine\ORM\En...')
#3 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(1092): Zend\ServiceManager\ServiceManager->createServiceViaCallback(Array, 'doctrineormenti...', 'Doctrine\ORM\En...')
#4 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(634): Zend\ServiceManager\ServiceManager->createFromFactory('doctrineormenti...', 'Doctrine\ORM\En...')
#5 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(597): Zend\ServiceManager\ServiceManager->doCreate('Doctrine\ORM\En...', 'doctrineormenti...')
#6 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(530): Zend\ServiceManager\ServiceManager->create(Array)
#7 /src/module/Event/src/Event/Form/Fieldset/Factory/EventFieldsetFactory.php(22): Zend\ServiceManager\ServiceManager->get('Doctrine\ORM\En...')
#8 [internal function]: Event\Form\Fieldset\Factory\EventFieldsetFactory->createService(Object(Zend\Form\FormElementManager\FormElementManagerV2Polyfill), 'eventfieldsetev...', 'Event\Fieldset\...')
#9 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(934): call_user_func(Array, Object(Zend\Form\FormElementManager\FormElementManagerV2Polyfill), 'eventfieldsetev...', 'Event\Fieldset\...')
#10 /src/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php(330): Zend\ServiceManager\ServiceManager->createServiceViaCallback(Array, 'eventfieldsetev...', 'Event\Fieldset\...')
#11 /src/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php(287): Zend\ServiceManager\AbstractPluginManager->createServiceViaCallback(Array, 'eventfieldsetev...', 'Event\Fieldset\...')
#12 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(634): Zend\ServiceManager\AbstractPluginManager->createFromFactory('eventfieldsetev...', 'Event\Fieldset\...')
#13 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(597): Zend\ServiceManager\ServiceManager->doCreate('Event\Fieldset\...', 'eventfieldsetev...')
#14 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(530): Zend\ServiceManager\ServiceManager->create(Array)
#15 /src/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php(161): Zend\ServiceManager\ServiceManager->get('Event\Fieldset\...', true)
#16 /src/vendor/zendframework/zend-form/src/FormElementManager/FormElementManagerTrait.php(38): Zend\ServiceManager\AbstractPluginManager->get('Event\Fieldset\...', Array, true)
#17 /src/vendor/zendframework/zend-form/src/Factory.php(111): Zend\Form\FormElementManager\FormElementManagerV2Polyfill->get('Event\Fieldset\...')
#18 /src/vendor/zendframework/zend-form/src/Form.php(176): Zend\Form\Factory->create(Array)
#19 /src/module/Inquiry/src/Inquiry/Form/InquiryForm.php(19): Zend\Form\Form->add(Array)
#20 /src/vendor/zendframework/zend-form/src/FormElementManager/FormElementManagerV2Polyfill.php(217): Inquiry\Form\InquiryForm->init()
#21 [internal function]: Zend\Form\FormElementManager\FormElementManagerV2Polyfill->callElementInit(Object(Inquiry\Form\InquiryForm), Object(Zend\Form\FormElementManager\FormElementManagerV2Polyfill))
#22 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(664): call_user_func(Array, Object(Inquiry\Form\InquiryForm), Object(Zend\Form\FormElementManager\FormElementManagerV2Polyfill))
#23 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(597): Zend\ServiceManager\ServiceManager->doCreate('Inquiry\Form\In...', 'inquiryforminqu...')
#24 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(530): Zend\ServiceManager\ServiceManager->create(Array)
#25 /src/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php(161): Zend\ServiceManager\ServiceManager->get('Inquiry\Form\In...', true)
#26 /src/vendor/zendframework/zend-form/src/FormElementManager/FormElementManagerTrait.php(38): Zend\ServiceManager\AbstractPluginManager->get('Inquiry\Form\In...', Array, true)
#27 /src/module/Inquiry/src/Inquiry/Controller/Factory/InquiryControllerFactory.php(23): Zend\Form\FormElementManager\FormElementManagerV2Polyfill->get('Inquiry\Form\In...')
#28 [internal function]: Inquiry\Controller\Factory\InquiryControllerFactory->createService(Object(Zend\Mvc\Controller\ControllerManager), 'inquirycontroll...', 'Inquiry\Control...')
#29 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(934): call_user_func(Array, Object(Zend\Mvc\Controller\ControllerManager), 'inquirycontroll...', 'Inquiry\Control...')
#30 /src/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php(330): Zend\ServiceManager\ServiceManager->createServiceViaCallback(Array, 'inquirycontroll...', 'Inquiry\Control...')
#31 /src/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php(287): Zend\ServiceManager\AbstractPluginManager->createServiceViaCallback(Array, 'inquirycontroll...', 'Inquiry\Control...')
#32 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(634): Zend\ServiceManager\AbstractPluginManager->createFromFactory('inquirycontroll...', 'Inquiry\Control...')
#33 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(597): Zend\ServiceManager\ServiceManager->doCreate('Inquiry\Control...', 'inquirycontroll...')
#34 /src/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(530): Zend\ServiceManager\ServiceManager->create(Array)
#35 /src/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php(161): Zend\ServiceManager\ServiceManager->get('Inquiry\Control...', true)
#36 /src/vendor/zendframework/zend-mvc/src/DispatchListener.php(94): Zend\ServiceManager\AbstractPluginManager->get('Inquiry\Control...')
#37 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
#38 /src/vendor/zendframework/zend-eventmanager/src/EventManager.php(490): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#39 /src/vendor/zendframework/zend-eventmanager/src/EventManager.php(263): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#40 /src/vendor/zendframework/zend-mvc/src/Application.php(340): Zend\EventManager\EventManager->triggerEventUntil(Object(Closure), Object(Zend\Mvc\MvcEvent))
#41 /src/public/index.php(15): Zend\Mvc\Application->run()
#42 {main}

【问题讨论】:

  • 数据库连接详细信息是否正确?
  • 很难说你为什么会在没有更多上下文的情况下得到这个错误。请显示您收到此错误的工厂代码和您的 application.config.php
  • 是的,对不起,我昨天得赶时间,所以我不能添加一些源代码。现在我添加了它。
  • 请将所有堆栈跟踪添加到您的帖子中
  • 也是您的application.config.phpmodules

标签: php doctrine-orm zend-framework2


【解决方案1】:

第一个麻烦是你的配置加载器。您已将其修改为包含:

    'config_glob_paths' => [
        'config/autoload/local/{,*.}local.php',
        'config/autoload/global/{,*.}global.php'
    ],

但是您的文件夹设置为:

config/autoload/global/doctrine.php

所以加载器不会匹配。

此全局路径适用于您的文件结构:

    'config_glob_paths' => [
        'config/autoload/local/{,*.}php',
        'config/autoload/global/{,*.}php'
    ],

作为替代方案,我上传了一个更“标准”的配置设置,可以帮助您:

https://github.com/Saeven/doctrine-error/tree/master/src/config

不过,简而言之,您遇到了严重错误,因为无法建立连接,仅仅是因为您的数据库详细信息不存在(因为您的配置加载器已被冲洗)。

其次,看起来您的 composer.json 正在加载一些不兼容的项目。我使用了我维护的项目中的一个,并结合了加载程序修复程序,当我输入有效的数据库凭据时,我看到了“测试”:

composer.json

{
  "name": "test",

  "minimum-stability": "dev",

  "require": {
      "php": ">=5.3.3",
      "zendframework/zend-servicemanager": "@stable",
      "zendframework/zend-eventmanager": "@stable",
      "zendframework/zend-modulemanager": "@stable",
      "zendframework/zend-developer-tools": "@stable",

      "zendframework/zend-config": "@stable",
      "zendframework/zend-console": "@stable",
      "zendframework/zend-test": "@stable",
      "zendframework/zend-crypt": "@stable",
      "zendframework/zend-mail": "@stable",
      "zendframework/zend-text": "@stable",
      "zendframework/zend-serializer": "@stable",
      "zendframework/zend-mvc": "2.5.3",
      "zendframework/zend-filter": "@stable",
      "zendframework/zend-db": "@stable",
      "zendframework/zend-stdlib": "@stable",
      "zendframework/zend-view": "@stable",
      "zendframework/zend-form": "@stable",
      "zendframework/zend-validator": "@stable",
      "zendframework/zend-i18n": "@stable",
      "zendframework/zend-log": "@stable",
      "zendframework/zend-cache": "@stable",

      "doctrine/doctrine-orm-module": "0.8.0",
      "doctrine/orm": "2.5.*@dev"
  }
}

【讨论】:

  • 嘿 Saeven,确实我的 autload 目录的配置是错误的。但这不是主要问题。正如你所说,composer.json 文件已经加载了一些不兼容的项目,但我真的不明白为什么?没关系,有了您所需的物品,一切正常!非常感谢您抽出宝贵的时间,克隆我的仓库等...
  • 这是我的荣幸,嘿,我会为了一个好的赏金做任何事! ;) 祝 ZF2 好运—— ZF3 也即将到来!另外,我在您的骨架中注意到您遇到了 ServiceLocator 警告。我有一篇博文可能对您有所帮助:circlical.com/blog/2016/3/9/preparing-for-zend-f
  • 谢谢,但是以这种方式调用服务定位器只是为了显示错误。我通常不这样做:)
  • 没有问题,不过请查看惰性工厂——这很有帮助!你想让我修改我的答案来锁定赏金吗? ;)
【解决方案2】:

我认为您的问题出在您的工厂以及如何获得 EntityManager。

这是在 ZF2 工厂中如何从 serviceLocator 获取 Doctrine\ORM\EntityManager 的方法:

class YourFactory implements FactoryInterface  
{

    public function createService(ServiceLocatorInterface $serviceLocator) 
    {            
        /* @var $em \Doctrine\ORM\EntityManager */
        $em = $serviceLocator->getServiceLocator()->get('em');

        // $em contains methods to get repo, etc ...

        // injections here
        $obj = new Obj();
        $obj->setEntityManager($em);

        return $obj;
    }

}

试试看告诉我

【讨论】:

  • 不,这不是问题所在。实体管理器的注册服务名称为doctrine.entitymanager.orm_defaultDoctrine\ORM\EntityManager应该是该服务的别名。
  • 你能在这里帮助一个 ZF2 菜鸟吗?我不知道我应该把这个工厂文件放在哪里,以及如何告诉 ZF2 加载它。你能补充一点吗?
  • @JohnYeates 这个工厂(虚拟)就是一个例子。任何工厂都必须在服务管理器中通过配置文件在factories 部分中声明。请阅读文档framework.zend.com/manual/2.4/en/modules/…
猜你喜欢
  • 2012-12-02
  • 2013-03-26
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
相关资源
最近更新 更多