Zend Framework 2覆盖现有服务?

时间:2013-11-12 12:45:53

标签: service zend-framework2

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

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

提前致谢!

3 个答案:

答案 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()”,它按如下方式“规范化”名称:

  1. 所有_ / \和 - 都被删除
  2. 密钥为小写
  3. 因此,“GoalioRememberMe \ Service \ RememberMe”和“goaliorememberme_rememberme_service”都成为“goalioremembermemembermemeservice”(即它们都是相同的),因此错误信息。

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