无法启动会话:已由 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在取消设置变量后修复会话未启动

致命:错误 - 会话已由session.auto-start或session_start()启动

销毁 php 后启动会话

在不启动 PHP 会话的情况下检查?

php中如何启动Session会话

检查 PHP 会话是不是已经开始