我正在使用 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/