【问题标题】:Persisting Binary Data Using DataFixtures in Symfony2在 Symfony2 中使用 DataFixtures 持久化二进制数据
【发布时间】:2014-08-23 09:54:35
【问题描述】:

我正在重构一个项目,并决定使用 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\Component\Debug\Exception\ContextErrorException]
可捕获的致命错误:传递给 {MyClass}::setEmail() 的参数 1 必须 是二进制的实例,给定字符串

我尝试加密字符串(使用与之前相同的过程),但仍然只是返回一个字符串:

$encEmail=\mcrypt_encrypt(MCRYPT_RIJNDAEL_128, ENCKEY, 'test@test.com', MCRYPT_MODE_ECB);
$user1->setEmail($encEmail);

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

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

谢谢。

【问题讨论】:

  • Doctrine 2.1 允许使用字段类型 blob,如 here 所述。
  • 谢谢 - 但我知道 DBAL 2.4.4 中提供了二进制字段,希望将来会包含在 Symfony2/Doctrin2 中。我知道我们暂时将使用 MySQL,可移植性并不是真正的问题,只要二进制字段得到原生支持,我就可以更改我的实体,所以我不明确定义二进制字段。

标签: php symfony doctrine-orm binary


【解决方案1】:

经过大量挠头后,我解决了这个问题。所以如果其他人有类似的问题 - 这对我有用......

不敢相信我错过了它,但事实证明“问题”是由教义产生的突变器引起的,并且期待二进制参数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多