Uchwyt do storage powinien być zdefiniowany jako Dependency klasy PlayerFactory.
class PlayerFactory
{
protected $storage = null;
// ...
public function __construct(Storage $storage)
{
$this->storage = $storage;
}
public function createPlayer($id)
{
// $this->storage to handler to klasy, która zajmuje się połączeniem z Twoim storage - może to być to PDO dla MySQL albo jakiś ORM albo cokolwiek używasz
$data = $this->storage->getPlayerData($id);
return new PlayerModel($data);
}
// ...
}
Następnie wywołanie tego kodu w jakimś miejscu wyglądało by tak:
$session = new Session(); // jakiś obiekt, którym zarządzasz sesją
$storage = new Storage(); // jakiś obiekt, którym zarządzasz magazynem danych - innymi słowy to ta klasa powinna być świadoma o obiekcie $db, który trzyma połączenie do bazy danych
$factory = new PlayerFactory($storage); // fabryka graczy
$player = $factory->createPlayer($session->getId()); // za pomocą fabryki tworzysz obiekt klasy PlayerModel, który zawiera WSZYSTKIE dane odnośnie gracza. Zauważ, że ID przekazane do createPlayer() pobrałeś od obiektu Session(), który potrafi operować na sesji
echo $player->getId(); // zwraca Id gracza echo $player->getName(); // zwraca name gracza echo $player->getLevel(); // zwraca poziom gracza // itd./
Wszystkie gettery które użyłem na $player, oczywiście musisz zdefiniować wewnątrz klasy PlayerModel. Połaczenie z bazą danych powinno być zdefiniowane gdzieś wewnątrz klasy Storage, czyli np.:
class Storage {
protected $db = null;
public function __construct()
{
$this->db = new PDO(...);
}
public function getPlayerData($id) // zauważ, że własnie tę metodę wykorzystuje metoda PlayerFactory::createPlayer() do pobrania danych
{
$stmt = $this->db->prepare("SELECT * FROM players WHERE id=:id");
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
Pamiętaj , że obiekt klasy Storage() powinieneś stworzyć RAZ na całą swoją aplikację i następnie wstrzykiwać tam gdzie jest Ci potrzebny, by nie tworzyć zbędnych połączeń do bazy danych. Oczywiście jest to bardzo prosta implementacja takiego magazynu danych. Wraz ze wzrostem wiedzy, wyabstraktujesz tę klasę do masy innych podklas.