无法启动会话:已由 PHP 启动(设置了 $_SESSION)。 500 内部服务器错误 - RuntimeException
Posted
技术标签:
【中文标题】无法启动会话:已由 PHP 启动(设置了 $_SESSION)。 500 内部服务器错误 - RuntimeException【英文标题】:Failed to start the session: already started by PHP ($_SESSION is set). 500 Internal Server Error - RuntimeException 【发布时间】:2014-02-12 02:30:53 【问题描述】:我正在尝试为我的 usermanagementbundle 实现一个简单的登录页面,而且我是通过 formbuilder 创建表单的新手。我的包中只有 3 个函数有一个新会话,并且在不同的路由中调用它,即使我删除了其他 2 个,我仍然会收到相同的错误。这是我的代码:
<?php
namespace Acme\UserManagementBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Acme\UserManagementBundle\Entity\Users;
use Acme\UserManagementBundle\Form\SigninType;
class DefaultController extends Controller
public function indexAction()
$session = new Session();
$users = new Users();
$form = $this->createForm(new SigninType(), $users);
if ($session->has('token'))
return $this->render('AcmeUserManagementBundle:Default:home.html.twig', array('token' => $session->get('token')));
if (!($session->has('alert')))
$session->set('alert', 'Welcome');
return $this->render('AcmeUserManagementBundle:Default:index.html.twig', array('form' => $form->createView(), 'alert' => 'Welcome!'));
else
$alert = $session->get('alert');
$session->clear();
return $this->render('AcmeUserManagementBundle:Default:index.html.twig', array('form' => $form->createView() ,'alert' => $alert));
public function logoutAction()
$session = new Session();
$session->invalidate();
return $this->render('AcmeUserManagementBundle:Default:index.html.twig');
public function signupAction()
return $this->render('AcmeUserManagementBundle:Default:signup.html.twig');
public function LoginAction(Request $request)
$session = new Session();
if ($request->getmethod()=='POST' || $session->get('token') != "")
$user = $request->get('user');
$password = $request->get('password');
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository('AcmeUserManagementBundle:Users');
$username = $repository->findOneBy(array('username'=>$user,'password'=>$password));
if (!$session->get('token') && $username)
$token = $this->get('token_generator')->getToken();
$session->set('token', $token, 'user', $username);
else
$session->set('alert', 'Invalid Username and/or Password!');
return $this->redirect($this->generateUrl('homepage'));
return $this->redirect($this->generateUrl('homepage'));
else
return $this->redirect($this->generateUrl('homepage'));
当我试图在我的函数中实现一个 formbuilderinterface 时,我突然遇到了这个与从 html 正常创建的情况相比,我完全没有遇到任何问题。我的代码有问题吗?因为我通过 HTML 尝试了这个登录代码并将其转换为 Symfony 的 formbuilderinterface 组件。
【问题讨论】:
【参考方案1】:默认情况下,Symfony2 会自动为您启动会话。
不需要$session = new Session();
试试这个,
public function indexAction(Request $request)
$session = $request->getSession();
参考:http://symfony.com/doc/current/book/controller.html#managing-the-session
【讨论】:
我的回答是否遗漏了什么? 抱歉,我试图发布我评论的那个作为答案.. 但您似乎已经指出了这一点。我已将其删除并将您的答案标记为正确。干杯! Symfony 文档有提到这个吗?或者为什么不呢?【参考方案2】:你做错了!
我一直在浪费时间寻找解决该问题的方法,并最终在 functionAction() 中做同样的事情(使用 Request $request )将会话变量发送到模板。
然而这一切都是错误的。 TWIG 可以直接访问所有会话变量,您不需要在 TWIG 的 render() 中传递任何变量。
要回答最初的问题,您应该保留 indexAction() 的默认行为,不带参数,并从 TWIG 渲染中删除“ array('token' => $session->get('token')) ”打电话。
唯一需要知道的是,您可以直接在模板中调用会话变量“token”,使用: app.session.get('token')
让魔法成为现实!就这么简单!
【讨论】:
以上是关于无法启动会话:已由 PHP 启动(设置了 $_SESSION)。 500 内部服务器错误 - RuntimeException的主要内容,如果未能解决你的问题,请参考以下文章