我正在重构项目,并决定使用Symfony2作为我的框架。我使用的是与之前相同的数据库模式,但是使用DataFixtures和Doctrine2创建一些测试数据时遇到了困难。
有问题的数据库字段将包含一个加密的电子邮件字段,该字段存储为VARBINARY并定义为:
/**
* @ORM\Column(type="string", columnDefinition="VARBINARY(254) NOT NULL")
*/
protected $email;
注意 - 我知道这不是可移植的,但在稳定的DBAL版本中还没有二进制字段。
在我的数据夹具中,我正在做:
$user1 = new User();
$user1->setName('Joe Bloggs');
$user1->setEmail('test@test.com');
...
$manager->persist($user1);
...
$manager->flush();
可以理解的是产生以下错误(我已经替换了类路径等以提高可读性):
[Symfony的\元器件\调试\异常\ ContextErrorException]
可捕获的致命错误:传递给{MyClass} :: setEmail()的参数1必须 是二进制的实例,给定字符串
我尝试加密字符串(使用我之前执行的相同过程),但这仍然只是返回一个字符串:
$encEmail=\mcrypt_encrypt(MCRYPT_RIJNDAEL_128, ENCKEY, 'test@test.com', MCRYPT_MODE_ECB);
$user1->setEmail($encEmail);
我试图将输出打包成二进制字符串,我尝试将其转换为二进制字符串,但两者都没有用。
我知道我可以手动将测试数据直接创建到数据库中,但为了学习,我希望得到数据夹具。
感谢。
答案 0 :(得分:0)
经过大量的努力,我已经解决了这个问题。所以如果其他人有类似的问题 - 这对我有用......
无法相信我错过了它,但事实证明这个问题是'是由学说生成并期待二元论证的变异器引起的:
/**
* Set email
*
* @param \binary $email
* @return User
*/
public function setEmail(\binary $email)
{
$this->email = $email;
return $this;
}
所以我更改了它(以及其他将成为二进制的字段)接受字符串并在返回之前将其转换为二进制文件:
public function setEmail($email)
{
$this->email = (binary)$email;
return $this;
}
数据现在按预期持久保存到数据库。
我不能100%确定我是否需要在返回前转换为二进制文件。如果我不这样做,这些值仍会存储在数据库中并且在检查时 - 看起来是正确的。但我觉得我应该像数据库所期望的那样!