php - 使用 Doctrine 类型更新具有相同 PHP 值的数据库值

标签 php types doctrine-orm

我正在使用 Doctrine2 类型来加密数据库值。该类型通过加密和解密在内部将 PHP 值与数据库值相互转换。由于 Doctrine2 类型,这非常有效。

加密存储为 base64 编码字符串。每个加密字符串都以固定的定义前缀为前缀。这意味着数据库字段包含加密和解密的值(这是外部要求所要求的),由前缀识别。


我的愿望是:

假设我有一个实体。我想使用 Doctrine 强制加密或解密实体的所有属性。为此,我强制将类型中的数据库值以加密或解密的形式存储。

但是,当我调用方法 EntityManager::computeChangeSets 时,实体的所有属性都未标记为已更改。当然实际数据(PHP 值)没有改变。但是,数据库值确实(应该)发生变化。

如何实现?


一些 Doctrine 类型的代码:

<?php

use Doctrine\DBAL\Types\Type;

class EncryptedType extends Type {

    private static $forceDecrypt = false;

    // Encryption stuff, like encrypt () and decrypt ()

    public function convertToPHPValue($value, AbstractPlatform $platform) {
        if ($value === null) {
            return null;
        }
        return $this -> decrypt($value, false);
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform) {
        if ($value === null) {
            return null;
        }
        if (self::$forceDecrypt) {
            return (string) $value;
        }
        return $this -> encrypt((string) $value, false);
    }
}

我删除了所有不需要的代码。

最佳答案

这不是一个错误吗?

解决方法:如果实体由管理器管理,则它的状态为 STATE_MANAGED,当您将其更改为 STATE_NEW 并强制更新时,这可以解决您的问题问题。

关于php - 使用 Doctrine 类型更新具有相同 PHP 值的数据库值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32869870/

相关文章:

spring - 正确使用 Spring 的 ResolvableType 来确定泛型类型

mysql - Entity 和 MySQL (Symfony2) 中的 Doctrine 数组类型

mysql - 教义 : a more efficient way to fetch all related entities in one swoop?

php - 在文件夹内创建 zip 文件,但该 zip 内不包含文件夹

php - 更新数据库中与 html 表单中的复选框关联的列表的最佳实践

php - 在 excel 中打开 CSV 文件会更改我的格式

Haskell 泛型类型参数解析器工具或方法

php - 如何在 codeigniter 的网站上进行信用卡支付

types - 在 OCaml 中分解产品类型分配

php - 如何获取 Doctrine 执行的所有查询?