【发布时间】:2015-12-28 11:05:45
【问题描述】:
我正在使用 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);
}
}
我已删除所有不需要的代码。
【问题讨论】:
标签: php types doctrine-orm