我正在使用名为GoalioRememberMe
的zf2模块,现在我想通过我的自定义服务覆盖其服务。或者,如果不可能,我想用我的配置覆盖Module.php。可能吗?
在“应用程序”模块中。我在module.config.php中写了这一行:
'GoalioRememberMe\Service\RememberMe' => 'Application\Service\RememberMe'
提前致谢!
答案 0 :(得分:7)
这正是建议将服务命名为返回的对象类型的原因。对象GoalioRememberMe\Service\RememberMe
在服务管理器中命名为goaliorememberme_rememberme_service
。您可以查看here。
所以解决方案很简单,而不是:
'GoalioRememberMe\Service\RememberMe' => 'Application\Service\RememberMe'
写这个
'goaliorememberme_rememberme_service' => 'Application\Service\RememberMe'
答案 1 :(得分:1)
正如Jurian所说,服务名称为goaliorememberme_rememberme_service
,并且已在getServiceConfig()
方法中设置。所以我在应用程序模块的Module.php
文件中编写了这段代码:
$serviceManager->
setAllowOverride(true)->
setInvokableClass('goaliorememberme_rememberme_service', 'Application\Service\CustomRememberMe')->
setAllowOverride(false);
用我的定制服务成功取代了!
非常感谢Jurian的大力帮助!
答案 2 :(得分:0)
实际上,服务管理器首先运行一个方法“canonicalizeName()”,它按如下方式“规范化”名称:
因此,“GoalioRememberMe \ Service \ RememberMe”和“goaliorememberme_rememberme_service”都成为“goalioremembermemembermemeservice”(即它们都是相同的),因此错误信息。
覆盖现有服务的最快方法是在/ config / autoload文件夹中创建* local.php或* global.php文件。 (该文件夹在config / application.config.php中标识。)模块加载后,此文件夹中的任何覆盖文件都是进程。如果您有重复的服务管理器密钥,则最后一个获胜。