Я работаю над инструментом для параллелизма с Doctrine 2.
Я сталкиваюсь с проблемой «лучшей практики» для извлечения нового экземпляра сущности без кеша (идея после этого состоит в том, чтобы иметь возможность сравнивать некоторые свойства из двух разных объектов одной и той же сущности и возвращать различия)
Некоторый код может помочь (+ документ: (http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html)):
// This is my current implementation.
$entity = $em->find(1);
$entity->setName('TEST');
// This entity as a "version" field equal to 2 in DB for example
try {
$em->lock($entity, LockMode::OPTIMISTIC, 1); // Will throw an OptimisticLockException
} catch(OptimisticLockException $e) {
$em->detach($entity);
$dbEntity = $this->find($entity->getId());
$em->detach($dbEntity);
$entity = $em->merge($entity);
var_dump($entity->getName()); // TEST
var_dump($dbEntity->getName()); // The old value
... do more stuff, like comparing the two objects ...
}
Является ли использование методов detach + merge хорошей практикой для такого поведения? Любая лучшая идея, чтобы улучшить этот код?
—
Изменить 1:
На самом деле, после добавления некоторых тестов, метод «слияния» — это не то, что я ожидал: объект не «повторно присоединяется» к единице работы.
Такое поведение не то, что я хочу, потому что разработчик не может вносить изменения + сбросить свою сущность после использования моего инструмента.
—
Изменить 2:
После того, как я покопался в документации и исходном коде, метод «слияния» — это то, что я и хотел: присоединен новый экземпляр объекта, а не тот, который я предоставил ($ entity в моем примере).
Поскольку этот код (в моем инструменте) находится в методе, целью которого является возвращение объекта $ dbEntity моего объекта $ entity, передавая ссылку на $ entity (&$ entity) решить мою проблему «Edit 1».
Задача ещё не решена.
Других решений пока нет …