我正在开发一个代表游戏后端的 PHP 小型测试应用程序。考虑以下:
// GameSession Model
class GameSession {
private $player;
...
}
// Player Model
class Player {
private $inventory;
...
}
// Inventory Model
class Inventory {
private $extensions;
...
}
class InventoryExtension {
...
}
class GameController {
public function newGame() {
// Create a new game session
$gameSession = new GameSession();
$gameSessionMySQL = new GameSessionMySQL();
...
// Save updated game session to DB
$gameSessionMySQL->update($gameSession);
}
}
我正在使用数据映射器对象“GameSessionMySQL”(未显示类定义)将游戏会话更新/保存到数据库。该映射器知道如何插入、更新、检索和删除游戏会话数据。
它不做的是更新 GameSession 中的 Player。Player 有自己的 PlayerMySQL 映射器。
此外,Player 模型有一个 Inventory 模型,它也有自己的 InventoryMySQL 映射器。Inventory 模型有一个 InventoryExtension。所以我猜我有一个树状的对象结构。
我被卡住了,因为我不知道应该在哪里实例化适当的映射器对象并使用它们?我应该将它们全部放在 GameController 中,从 GameSession 中获取()所需的模型吗?这对我来说似乎不太好,因为我最终可能会写出类似的东西:
$playerMySQL->update($game->Session->getPlayer());
$inventoryMySQL->update($gameSession->getPlayer()->getInventory());
$inventoryExpansionMySQL->update($gameSession->getPlayer()->getInventory()->getExpansion(1);
...
...等等,直到我最终得到一堆看起来可疑的程序行。
另一方面,也许每个模型都应该在其构造函数中实例化其所需的映射器,然后从其自己的(可能类似命名的)CRUD 方法中调用相关的 CRUD 方法?我对此表示怀疑,因为我相当有信心数据访问的东西应该与域对象分开。
我正在将所有这些实现到传统的MVC 范式中;也就是说,控制器除了接受来自它的输入之外,对视图什么都不做:P
我非常感谢有充分理由的明确答案。我还在学习 OO 技术,所以请在更晦涩的术语上放轻松:)
非常感谢