我凌驾于FOSUserBundle之上。 我将用户实体(此实体扩展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
如果我尝试首次显示此字段,则一切正常,每个下一个渲染显示空字符串。为什么?如何解决这个问题?
其他字段工作正常。
答案 0 :(得分:2)
从数据库加载实体时,Doctrine将不会使用您的setter来填充您的实体。因此,当您第一次调用getAvatar()
时,将执行stream_get_contents()
并从流中读取所有内容。下次调用此getter方法时,没有什么可以从流中读取。在调用stream_get_contents()
时,您可能希望将$avatar
返回的字符串保存在getAvatar()
中,就像在setAvatar()
中一样。