1

我正在开发一个代表游戏后端的 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 技术,所以请在更晦涩的术语上放轻松:)

非常感谢

4

0 回答 0