Làm việc với UnitOfWork
và computeChangeSets
bên trong một Người nghe Sự kiện của Học thuyết có lẽ là phương pháp được ưa thích.
Tuy nhiên : Nếu bạn muốn tồn tại và tạo ra một thực thể mới trong trình lắng nghe này, bạn có thể gặp phải rất nhiều rắc rối. Có vẻ như, người nghe thích hợp duy nhất sẽ onFlush
tự giải quyết vấn đề của chính nó.
Vì vậy, tôi đề xuất một so sánh đơn giản nhưng nhẹ, có thể được sử dụng trong Bộ điều khiển và thậm chí cả Dịch vụ bằng cách chỉ cần tiêm EntityManagerInterface
(lấy cảm hứng từ @Mohamed Ramrami trong bài đăng ở trên):
$uow = $entityManager->getUnitOfWork();
$originalEntityData = $uow->getOriginalEntityData($blog);
$defaultContext = [
AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object, $format, $context) {
return $object->getId();
},
];
$normalizer = new Serializer([new DateTimeNormalizer(), new ObjectNormalizer(null, null, null, null, null, null, $defaultContext)]);
$yourEntityNormalized = $normalizer->normalize();
$originalNormalized = $normalizer->normalize($originalEntityData);
$changed = [];
foreach ($originalNormalized as $item=>$value) {
if(array_key_exists($item, $yourEntityNormalized)) {
if($value !== $yourEntityNormalized[$item]) {
$changed[] = $item;
}
}
}
Lưu ý : nó thực hiện so sánh các chuỗi, ngày giờ, bools, số nguyên và số nổi một cách chính xác nhưng không thành công trên các đối tượng (do các vấn đề tham chiếu Thông tư). Người ta có thể so sánh các đối tượng này sâu hơn, nhưng ví dụ như phát hiện thay đổi văn bản, điều này là đủ và đơn giản hơn nhiều so với việc xử lý Trình xử lý sự kiện.
Thêm thông tin: