Symfony2启动会话失败:已被PHP启动

5

i got a very strange issue looking like this:

[2014-11-06 11:21:13] request.INFO: Matched route "core_timetracking_new_user" (parameters: "_controller": "Bricks\Custom\CoreBundle\Controller\TimeTrackingController::newuserAction", "_route": "core_timetracking_new_user") [] []
[2014-11-06 11:21:13] request.CRITICAL: Uncaught PHP Exception RuntimeException: "Failed to start the session: already started by PHP." at /var/cache/app/prod/classes.php line 113 {"exception":"[object] (RuntimeException: Failed to start the session: already started by PHP. at /var/cache/app/prod/classes.php:113)"} []

奇怪的是,我并没有开始一个会话或使用它。以下是控制器代码:
/**
 * @View
 */
public function newuserAction()
{
    $trackingService=$this->get('core.timetracking_service');
    $user= new TimeTrackingUser();
    $request=$this->getRequest();

    $form = $this->createFormBuilder($user)
        ->add('name','text')
        ->add('email','text')
        ->add('pass','password')
        ->add('save', 'submit', array('label' => 'Erstellen'))
        ->getForm();

    $form->handleRequest($request);

    if ($form->isValid()) {
        $trackingService->persistUser($form->getData());
        return $this->redirect($this->generateUrl('core_timetracking_user_list'));
    }else {
        return array(
            'form' => $form->createView()
        );
    }
}

虽然这个操作非常有效,但是需要注意:

/**
 * @View
 */
public function listuserAction()
{

    $request=$this->getRequest();
    $trackingService=$this->get('core.timetracking_service');    
    $users=$trackingService->getAllUsers();

    return array(
        'users' => $users
    );
}

所以唯一的区别是我使用了


$form->handleRequest($request); 

我检查了所有文件(包括AppKernel等)是否以正确的格式开始。
这两个操作(一个正常,一个异常)都在同一个控制器中。

2
你是否开启了“session.auto_start”配置选项?http://php.net/manual/en/session.configuration.php#ini.session.auto-start - Erik
嗨@john Smith,Symfony2会自动启动会话,所以如果您使用PHP函数或其他方式手动启动会话,则可能会出现问题,并且您可以在config.yml文件中停止自动启动会话。 - kuldipem
@Erik session.auto_start => Off => Off,看起来是关闭的。 - john Smith
当调用 $request=$this->getRequest(); 时,第二个操作也有效。在那里,我只是没有得到错误,似乎涉及了 $form->handleRequest。 - john Smith
2个回答

4

有没有除了禁用保护之外的替代方案?我也遇到了同样的问题并通过禁用它来解决 - 但我认为这不是最好的解决办法... - rakete
我猜不行。Symfony需要在某个地方保存CSRF令牌,而保留它跨越两个请求的唯一方法是会话。为什么阻止启动会话对你如此重要呢? - Thomas Landauer
@rakete 很不幸,这是一段时间以前的事情了,我记不清了,但可能是我们只是想知道而禁用了令牌。现在当我看到这个问题时,我真的很惊讶,因为在任何后来的Symfony项目中我从未遇到过同样的问题。 - john Smith

0

你应该检查是否有任何启动新会话的监听器。

你不能使用new Session()来创建一个监听器。在 action 方法中,你应该使用请求会话。


我有一个onKernelController监听器,它使用 new Session() 开始了一个新的会话,当表单尝试创建csrf令牌时,它会检查会话是否存在并抛出异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接