Symfony проверить получить старое значение без формы - PullRequest
0 голосов
/ 04 августа 2020

В нашем проекте у нас есть несколько сущностей, которые можно переводить (используя 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. Как мне получить старое значение?

...