Service Zend Framework 2是否覆盖现有服务?

Service Zend Framework 2是否覆盖现有服务?,service,zend-framework2,Service,Zend Framework2,我正在使用一个名为goaliomemberme的zf2模块,现在我想通过自定义服务覆盖它的服务。或者,如果不可能,我想用我的配置覆盖Module.php。可能吗 在应用程序模块中。我在module.config.php中写了这一行: 'goaliomemberme\Service\RememberMe'=>'Application\Service\RememberMe' 提前谢谢 这正是建议将服务命名为返回的对象类型的原因。对象goaliomemberme\Service\RememberMe在

我正在使用一个名为
goaliomemberme
的zf2模块,现在我想通过自定义服务覆盖它的服务。或者,如果不可能,我想用我的配置覆盖Module.php。可能吗

在应用程序模块中。我在module.config.php中写了这一行:
'goaliomemberme\Service\RememberMe'=>'Application\Service\RememberMe'


提前谢谢

这正是建议将服务命名为返回的对象类型的原因。对象
goaliomemberme\Service\RememberMe
在服务管理器中命名为
goaliomemberme\u RememberMe\u Service
。你可以检查一下

因此,解决方案很简单,而不是:

'GoalioRememberMe\Service\RememberMe' => 'Application\Service\RememberMe'
写这个

'goaliorememberme_rememberme_service' => 'Application\Service\RememberMe'

正如Jurian所说,服务名称是
goaliomberme\u rememberme\u service
,它是在
getServiceConfig()
方法中设置的。因此,我在应用程序模块的
Module.php
文件中编写了以下代码:

$serviceManager->
            setAllowOverride(true)->
            setInvokableClass('goaliorememberme_rememberme_service', 'Application\Service\CustomRememberMe')->
            setAllowOverride(false);
并且成功地用我的定制服务替换了它

非常感谢Jurian的大力帮助

实际上,服务管理器首先运行一个方法“canonicalizeName()”,该方法“规范化”名称,如下所示:

  • 所有的/\和-都被剥离
  • 这个键是小写的
  • 因此,“goaliomemberme\Service\RememberMe”和“goaliomberme\u RememberMe\u服务”都变成了“goaliomemberservice”(即它们都是相同的),因此会显示错误消息


    覆盖现有服务的最快方法是在/config/autoload文件夹中创建一个*local.php或*global.php文件。(该文件夹在config/application.config.php中标识。)加载模块后,将处理该文件夹中的任何重写文件。如果您有重复的service manager密钥,则最后一个密钥将获胜。

    tnx。这正是我想要的。这里有一个错误:一个名为或别名为“goaliomberme\u rememberme\u service”的服务已经存在,不能被覆盖;请使用另一个名称…我认为这是因为Goalio在module类中的
    getServiceConfig()
    方法中设置了服务。您试图覆盖配置文件中的服务。如果您也将其放在服务配置方法中,这会解决问题吗?否则,请参阅此答案以覆盖现有服务:Slumiman非常感谢。我跟踪了你的链接,并将其与你的帖子相结合,发布了一个新的答案。非常感谢。