2016-01-06 105 views
1

我超越了FOSUserBundle。 我改變了我的頭像場getter和setter用戶實體(此實體擴展FOSUser實體),以這樣的:爲什麼blob字段的圖像只顯示一次?

/** 
* @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 

如果我試圖顯示這個領域第一次一切正常,下一個渲染顯示空字符串。爲什麼?這個怎麼解決?

其他領域工作正常。

回答

2

從數據庫加載時,Doctrine不會使用您的setter填充實體。因此,當您第一次撥打getAvatar()時,將執行stream_get_contents()並從流中讀取所有內容。下次這個getter方法被調用時,沒有什麼可以從流中讀取。當您調用getAvatar()時,您可能希望將stream_get_contents()返回的字符串保存在$avatar屬性中,就像您在setAvatar()中所做的那樣。

+0

你有權利。我通過向函數stream_get_contents($ this-> avatar,-1,0)添加兩個參數來解決我的問題,其中'-1'表示讀取所有剩餘的緩衝區,'0'被偏移 – Exit196