0

我是 ZF2 世界的初学者,我有以下问题。

我正在编写浏览器游戏,我计划创建与游戏页面渲染相关的主 MVC 模块(例如 Oveview 页面、建筑物页面等)。不同的页面由不同的 Page\Controllers 生成。一切都很好。

但我还计划添加一些特定于引擎的模块,例如用户、行星、队列,它们应该只实现 MVC 的模型端(意味着没有视图和控制器)。只需实现模型来访问数据库并与渲染游戏页面的主 MVC 页面模块共享它。

我发明了将特定于引擎的模块 API 放入 serviceManager 的方法,以便页面控制器可以访问它(猜猜它是 ZF2 的常用方式)。例如我有用户界面:

interface UserInterface
{
    public function Create ();
    public function Load ($player_id);
    public function Login ();
    public function Logout ();
}

和实现它的 UserManager 类:

class UserManager implements UserInterface
{
    ....

在我的 \module\User\config\module.config.php 文件中,我添加了工厂,它将 UserManager 共享给其他模块:

return array (
    'service_manager' => array(
        'factories' => array(
            'UserManager' => function($sm) {                
                return new \User\UserManager ();
            },
        ),
    ),
);

没关系。页面控制器现在可以通过滥用 serviceManager 来访问 UserManager API:

$user = $this->getServiceLocator()->get('UserManager');

但是如何在 Controller 之外的模块之间共享 Module API 呢?

例如,我的 UserManager 需要对 PlanetManager 执行一些操作。

换句话说,我需要很好的 zend 方式来实现跨模型交互。谢谢。

4

1 回答 1

0

我不确定 的设计 UserInterface(它看起来更像是 a 的 API UserController)。

不过,如果UserManager依赖于PlanetManager,您可以将其作为依赖注入

最简单的方法是创建一个新工厂,就像使用UserManager.

行星管理器

class PlanetManager
{
  protected $userManager;

  public function __construct(UserManager $userManager)
  {
    $this->setUserManager($userManager);
  }

  public function setUserManager(UserManager $userManager);  
}

模块.php

return array (
    'service_manager' => array(
        'factories' => array(
            'UserManager' => function($sm) {                
                return new \User\UserManager ();
            },
            'PlanetManager' => function($sm) {
                $userManager = $sm->get('UserManager');

                return new PlanetManager($userManager);
            }
        ),
    ),
);
于 2013-11-12T09:15:02.323 回答