6

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

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

提前致谢!

4

3 回答 3

7

这正是建议将服务命名为返回对象类型的原因。该对象在服务管理器GoalioRememberMe\Service\RememberMe中命名。goaliorememberme_rememberme_service你可以在这里查看

所以解决方案很简单,而不是这样:

'GoalioRememberMe\Service\RememberMe' => 'Application\Service\RememberMe'

写这个

'goaliorememberme_rememberme_service' => 'Application\Service\RememberMe'
于 2013-11-12T14:39:48.683 回答
1

正如Jurian所说,服务名称是goaliorememberme_rememberme_service并且已经在getServiceConfig()方法中设置。所以我Module.php在Application Module的文件中写了这段代码:

$serviceManager->
            setAllowOverride(true)->
            setInvokableClass('goaliorememberme_rememberme_service', 'Application\Service\CustomRememberMe')->
            setAllowOverride(false);

并成功替换为我的定制服务!
非常感谢 Jurian 的大力帮助!

于 2013-11-13T21:53:32.843 回答
0

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

  1. 所有 _ / \ 和 - 都被删除
  2. 关键是小写

因此,“GoalioRememberMe\Service\RememberMe”和“goaliorememberme_rememberme_service”都变成了“goalioremembermeremembermeservice”(即它们都是相同的),因此是错误消息。

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

于 2014-01-15T15:34:02.823 回答