Symfony / Доктрина - Слушатель - Зашифровать / расшифровать

У меня есть слушатель для шифрования и дешифрования. Зашифровать:

public function prePersist(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();


    if ($entity instanceof Customer) {
        $entity->setEmail($this->encryption->encrypt($entity->getEmail()));
        $entity->setPhone($this->encryption->encrypt($entity->getPhone()));
    } elseif ($entity instanceof Address) {
        $entity->setFirstName($this->encryption->encrypt($entity->getFirstName()));
        $entity->setLastName($this->encryption->encrypt($entity->getLastName()));
        $entity->setCompanyName($this->encryption->encrypt($entity->getCompanyName()));
        $entity->setStreet($this->encryption->encrypt($entity->getStreet()));
        $entity->setCity($this->encryption->encrypt($entity->getCity()));
    }

    return;
}

public function postLoad(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();


    if ($entity instanceof Customer) {
        $entity->setEmail($this->encryption->decrypt($entity->getEmail()));
        $entity->setPhone($this->encryption->decrypt($entity->getPhone()));
    } elseif ($entity instanceof Address) {
        $entity->setFirstName($this->encryption->decrypt($entity->getFirstName()));
        $entity->setLastName($this->encryption->decrypt($entity->getLastName()));
        $entity->setCompanyName($this->encryption->decrypt($entity->getCompanyName()));
        $entity->setStreet($this->encryption->decrypt($entity->getStreet()));
        $entity->setCity($this->encryption->decrypt($entity->getCity()));
    }

    return;
}

Проблема связана с расшифровкой. Как изменить данные при загрузке, не сохраняя их в базе данных? Прямо сейчас он обновляет зашифрованные данные с помощью дешифрованной загрузки.

Спасибо

Почему вы не шифруете / не дешифруете свои геттеры / сеттеры?

Liora Haydont 25.04.2018 20:38

@LioraHaydont Мне сказали, что Listener - лучшее решение ... Мб. Я могу делать расшифровку в геттерах.

kironet 25.04.2018 20:40

Что не работает в вашем текущем коде?

Liora Haydont 25.04.2018 20:43

Как это должно работать: prePersist: зашифровать данные и сохранить в db. postLoad: временно (без сохранения / сохранения в БД) дешифровать данные из БД, когда я обращаюсь к ним в ветке или контроллере. ------ Как это работает: prePersist: Как и ожидалось. postLoad: обновляет существующие (зашифрованные) данные в БД до расшифрованных.

kironet 25.04.2018 20:52

какую библиотеку вы используете для шифрования / дешифрования значений?

eazybob 22.09.2020 21:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
5
492
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, что вам не следует использовать событие prePersist, поскольку это событие вызывается только при добавлении объекта в эту базу данных, но не при его обновлении.

В списке событий жизненного цикла Doctrine здесь вы можете увидеть, что событие, которое вы хотите использовать, - это preUpdate, чтобы при каждом изменении оно снова зашифровывалось перед сохранением.

Спасибо за помощь. Я очень ценю это .

kironet 25.04.2018 21:17

Другие вопросы по теме