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