如何在ZF2模块之间共享模型

时间:2013-11-12 08:44:40

标签: php module zend-framework2

我是ZF2世界的初学者,我遇到了以下问题。

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

但我还计划添加一些特定于引擎的模块,例如User,Planet,Queue,它应该只实现MVC的Model侧(意味着没有View和没有Controller)。只需实现Model即可访问数据库并与主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文件中,我添加了factory,它将UserManager共享给其他模块:

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

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

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

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

例如,我的UserManager需要使用PlanetManager执行某些操作。

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

1 个答案:

答案 0 :(得分:0)

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

然而,如果UserManager依赖于PlanetManager,您可以注入依赖

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

一样

<强> PlanetManager

class PlanetManager
{
  protected $userManager;

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

  public function setUserManager(UserManager $userManager);  
}

<强> Module.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);
            }
        ),
    ),
);