2012-10-22 57 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)。 –

相关问题