在Symfony2中使用DataFixtures保留二进制数据

时间:2014-08-23 09:54:35

标签: php symfony doctrine-orm binary

我正在重构项目,并决定使用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);

我试图将输出打包成二进制字符串,我尝试将其转换为二进制字符串,但两者都没有用。

我知道我可以手动将测试数据直接创建到数据库中,但为了学习,我希望得到数据夹具。

感谢。

1 个答案:

答案 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%确定我是否需要在返回前转换为二进制文件。如果我不这样做,这些值仍会存储在数据库中并且在检查时 - 看起来是正确的。但我觉得我应该像数据库所期望的那样!