Я хотел бы создать в своем коде слой, подобный API, который эффективно ограничивает доступ базы данных к коду более высокого уровня. Например, у меня может быть следующая функция:
class MyApi {
private $my_user_id;
function getContacts() {
$contacts = $em->getRepository('Contacts')->findByOwner($this->my_user_id);
$em->clear();
return $contacts;
}
function getGroups() {
$groups = $em->getRepository('Groups')->findByOwner($this->my_user_id);
//hydrate each group's contacts list
foreach ($groups as $group) {
$group->getContacts();
}
$em->clear();
return $groups;
}
}
Я использую $ em-> clear () для отсоединения сущностей от EntityManger перед их возвратом, поэтому мои представления не могут случайно изменить управляемые сущности. Однако я сталкиваюсь с проблемами, когда хочу сравнить сущности, возвращаемые двумя последовательными функциями API. В идеале я хотел бы, чтобы представление / контроллер содержало:
$my_contacts = $myapi->getContacts();
$my_groups = $myapi->getGroups();
foreach($my_groups as $group) {
foreach ($my_contacts as $contact) {
if ($group->getContacts()->contains($contact)) {
echo "{$group->getName()} contains {$contact->getName()}!<br/>";
} else {
echo "{$group->getName()} does not contain {$contact->getName()}!<br/>";
}
}
}
Однако, поскольку я отсоединил все контакты от EntityManager в конце вызова API getContacts, объекты, возвращаемые $group->getContacts()
, отличаются PHP-объектами от объектов, возвращаемых $api->getContacts()
, поэтому функция contains()
не работает должным образом.
Есть ли у меня какие-либо варианты «отсоединения» моих сущностей, чтобы сделать их доступными только для чтения, не отказываясь от преимуществ, которые предоставляет EntityManager? (Например, все управляемые объекты, представляющие одну и ту же запись базы данных, являются одним и тем же объектом и могут дополнительно увлажнять связанные объекты после их передачи из API и т. Д.)