我是 ZF2 世界的初学者,我有以下问题。
我正在编写浏览器游戏,我计划创建与游戏页面渲染相关的主MVC模块(例如Oveview页面,建筑物页面等)。不同的页面由不同的页面''控制器生成。一切都很好。
但我也计划添加一些特定于引擎的模块,例如User,Planet,Queue,它们应该只实现MVC的模型端(意味着没有视图和控制器)。只需实现模型即可访问数据库,并将其与主MVC页面模块共享,该模块呈现游戏页面。
我发明了将特定于引擎的模块 API 放入 serviceManager 的方法,以便页面控制器可以访问它(猜猜它在 ZF2 中的常用方式)。例如,我有用户界面:
interface UserInterface
{
public function Create ();
public function Load ($player_id);
public function Login ();
public function Logout ();
}
和实现它的用户管理器类:
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 ();
},
),
),
);
没关系。页面控制器现在可以通过滥用服务管理器来访问用户管理器 API:
$user = $this->getServiceLocator()->get('UserManager');
但是如何在控制器外部的模块之间共享模块 API?
例如,我的用户管理器需要使用PlanetManager执行一些操作。
换句话说,我需要很好的zend-way来实现跨模型交互。谢谢。
我不确定UserInterface
的设计(它看起来更像是UserController
的 API)。
但是,如果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);
}
),
),
);