В нашем проекте у нас есть несколько сущностей, которые можно переводить (используя Translatable из DoctrineBehaviors). У наших пользователей есть права на языки (или нет), и если у пользователя нет прав на язык, он не должен обновлять поле.
В качестве лучшего объяснения у меня есть 2 объекта (не полностью выписаны но важная вещь):
+------------------------+
| TranslationKey |
+------------------------+
| id INT |
| translationKey STRING |
| translations COLLECTION|
+------------------------+
+------------------------+
| TranslationContent |
+------------------------+
| id INT |
| translation STRING |
| locale STRING |
+------------------------+
В основном, у каждого пользователя есть один или несколько языков, и если локаль находится в массиве сокращений языков пользователя, пользователь может редактировать перевод для этого языка .
Однако без формы (например, если мы когда-нибудь начнем использовать запросы API), сущность все равно должна быть проверена. Моя идея заключалась в следующем: создать настраиваемую проверку и проверить, редактируется ли поле (например, когда поле не редактируется, оно не должно выходить из строя), если это так: проверить права и выдать ошибку или вернуть исходное значение.
Я получил этот пример маршрута (просто тестовый маршрут, который не будет использоваться в производстве):
/**
* @Route("tuet/{translationKey}", name="tuet")
*/
public function testUpdateEnglishTranslation(TranslationKey $translationKey, ObjectManager $em, ValidatorInterface $validator) {
$translationKey->setTranslation('en', 'products2', $validator);
$validator->validate($translationKey);
return $this->render('base.html.twig');
}
Я добавил класс проверки, который выглядит так:
class CanEditEnglishLanguageValidator extends ConstraintValidator {
private $em;
public function __construct(EntityManagerInterface $em) {
$this->em = $em;
}
public function validate($object, Constraint $constraint) {
dd($this->em->getRepository(get_class($object))->find(1)->getTranslation('en'));
}
}
Однако по какой-то причине - вероятно, из-за того, что объект сущности кэширован в Doctrine - dd будет отображать новый перевод вместо старого, однако новый находится в object
. Как мне получить старое значение?