Пример с MySQL:
/*
* Used to create a populated Staff instance
*/
class StaffCreator
{
/** @var MySql */
private $mySql;
function __construct(MySql $mySql)
{
$this->mySql = $mySql;
}
function createStaff(string $username): Staff
{
$staff = new Staff();
$staff->setData($this->getData($username));
return $staff;
}
function getData(string $username): array
{
return $this->mySql
->query("SELECT .. WHERE username = ?")->param($username)->getResults();
}
}
//calling:
$staff = (new StaffCreator($mysql))->createStaff($username);
Пример с Доктриной:
/**
* Creates Ledger
*/
class LedgerCreator
{
private $doctrine;
function __construct(EntityManager $doctrine)
{
$this->doctrine = $doctrine;
}
/**
* Create Domain entity called Ledger,
* populate it with items and metadata
* Return it
*/
function getLedger(int $ledgerId): Ledger
{
$query = $this->doctrine->createQuery('
SELECT ...
FROM ...
WHERE ...
')->setParameter('ledger_id', $ledgerId);
//create, init, populate, and return Ledger instance
$ledger = new Ledger($this->doctrine->find(LedgerEntity::class, $ledgerId));
$ledger->setItems($query->getResult());
return $ledger;
}
}
//to call:
$ledger = new LedgerCreator($doctrine)->createLedger($id);
Эта модель фабрика? Хранилище? DataMapper? Гибрид? Что-то другое?
Это извращенная версия строителя. Создает экземпляр объекта с заданными свойствами. В сочетании с картографом данных и хранилищем))
Этот вид выглядит как Memento
, От Справочник по шаблонам PHP Design:
В паттерне Memento объект memento будет содержать состояние другого объекта.
От Википедия:
Шаблон сувенира реализован с тремя объектами: инициатором, смотрителем и памятным подарком. Отправитель — это некоторый объект, который имеет внутреннее состояние. Смотритель собирается что-то сделать с отправителем, но хочет иметь возможность отменить изменения. Смотритель сначала запрашивает у создателя памятного предмета.
В этом примере класс BookMark представляет собой «Memento» и содержит состояние класса BookReader. В этом примере класс BookReader будет «инициатором», поскольку он имеет исходное состояние. TestMemento.php содержит объект BookMark, как и «смотритель».
Относительно ваших примеров:
----------- Example -----------
Participant | Mysql | Doctrine
============|==============|==============
Originator | MySql | EntityManager
Caretaker | StaffCreator | LedgerCreator
Memento | Staff | Ledger