2012-10-22 103 views
0

我試着去啓動(或訪問),像這樣一個會話:Symfony 2會話頭文件已發送?

$session = new Session(); 
    echo $session->getId(); 

其中根據文檔應該是所有我需要的,因爲會得到自動啓動(http://symfony.com/doc/master /components/http_foundation/sessions.html):

While it is recommended to explicitly start a session, a sessions will actually start 
on demand, that is, if any session request is made to read/write session data. 

儘管如此,即時得到錯誤

Failed to start the session because headers have already been sent. 

繼承人的原始控制器這就是調用服務:

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Bundle\FrameworkBundle\Routing\Router; 
use Symfony\Component\HttpFoundation\Response; 

     $auth = $this->get('authentication'); 
     $user_id = $auth->getUserId(); 

然後是getUserId功能:

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\Session\Session; 

public function getUserId() { 
    $session = new Session(); 
    echo $session->getId(); 

如果我改變getUserId看起來像這樣:

public function getUserId() { 
    $session = $this->getRequest()->getSession(); 
    echo $session->getId(); 

我得到的錯誤:

Call to a member function get() on a non-object 
+0

在嘗試訪問會話之前,您是否向瀏覽器發送過任何輸出? –

+0

@ KevinM1除非Symfony默認設置爲 –

+0

代碼結構中的代碼位於Controller中? – Alex

回答

2

您正在查看s的文檔tand-alone組件「HTTP基礎」。這意味着在使用全棧框架symfony2時必須非常小心。

Symfony2已經處理了請求/響應和會話,因此您不需要創建任何會話對象。您可以閱讀正常文檔中的如何使用會話,章節Controller

要在控制器訪問會話,如果你要訪問一個服務的內部會議所有你需要的是

$session = $this->getRequest()->getSession(); 

,你需要通過服務「請求」爲您服務的依賴。陽明海運和不是通過

$session = $request->getSession(); 

訪問會話如果你不使用它時,Service Container章有一些描述。

+0

有趣。當我實現它時,它給了我錯誤'致命錯誤:調用成員函數get()在/newsite/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php中的非對象在線180' –

+0

您正在使用symfony2全棧框架?你使用2.0還是2.1?你能否更新整個控制器(包含類聲明/使用語句)? – Sgoettschkes

+1

當你只需要會話而不是請求時,你實際上可以注入'session'服務。這樣你就避免了[範圍問題](http://symfony.com/doc/master/cookbook/service_container/scopes.html)。 –

相關問題