为什么blob字段中的图像只显示一次?

时间:2016-01-06 13:54:49

标签: doctrine blob fosuserbundle symfony

我凌驾于FOSU​​serBundle之上。 我将用户实体(此实体扩展FOSUser实体)中的头像字段getter和setter更改为:

/**
* @ORM\Column(type="blob")
*/
protected $avatar;

public function setAvatar($avatar) {
    if ($avatar != null) {
        $strm = fopen($avatar->getRealPath(), 'rb');
        $this->avatar = stream_get_contents($strm);
    }
    return $this;
}

public function getAvatar() {
    if ($this->avatar != null) {
        return base64_encode(stream_get_contents($this->avatar));
    } else {
        return $this->avatar;
    }
}

它可以工作但只在第一次渲染

<img alt="User avatar" src="data:image;base64,{{app.user.avatar}}"/> //working
<img alt="User avatar" src="data:image;base64,{{app.user.avatar}}"/> //not working

如果我尝试首次显示此字段,则一切正常,每个下一个渲染显示空字符串。为什么?如何解决这个问题?

其他字段工作正常。

1 个答案:

答案 0 :(得分:2)

从数据库加载实体时,Doctrine将不会使用您的setter来填充您的实体。因此,当您第一次调用getAvatar()时,将执行stream_get_contents()并从流中读取所有内容。下次调用此getter方法时,没有什么可以从流中读取。在调用stream_get_contents()时,您可能希望将$avatar返回的字符串保存在getAvatar()中,就像在setAvatar()中一样。