Failed to start the session: already started by PHP ($_SESSION is set). 500 Internal Server Error - RuntimeException
Asked Answered
V

2

17

I am trying to implement a simple login page for my usermanagementbundle and I'm new in creating a form thru formbuilder. There is only 3 function inside my bundle where there is a new session and it is called in different routes, even if I remove the other 2 I still receive the same error in it. Here is my code:

    <?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'));
            }   
        }
    }

When I tried to implement a formbuilderinterface inside my function I suddenly encountered this one vs. the normal creating of from thru html which I've get no problems at all. Is there a problem with my code? because I tried this login code thru HTML and convert it to formbuilderinterface component of Symfony.

Vanettavang answered 22/1, 2014 at 6:47 Comment(0)
C
50

Symfony2, by default, starts sessions for you automatically.

There is no need of $session = new Session();

Try this,

  public function indexAction(Request $request)
 {
    $session = $request->getSession();

Ref: http://symfony.com/doc/current/book/controller.html#managing-the-session

Chlo answered 22/1, 2014 at 6:51 Comment(3)
Did I missed any thing in my answer?Chlo
ow sorry, I tried to post the one I've comment as an answer.. but it seems you already pointed it out already. I've deleted it and mark your answer as correct. Cheers!Vanettavang
does the Symfony docu mention this? Or why doesn't it it?Isthmian
H
1

You're doing it wrong !

I've been wasting some time looking for a solution for that problem, and end up doing the same thing ( using Request $request ) in the functionAction() to send a session variable to a template.

However all of this is wrong. TWIG is able to access to all session variables directly, you don't need to pass any variable in the TWIG render().

To answer the original problem, you should keep the default behavior of indexAction() with no parameter, and remove the " array('token' => $session->get('token')) " from your TWIG render call.

The only thing to know is that you can call the session variable "token" directly in your template, using : {{ app.session.get('token') }}

And let the magic be ! That simple !

Hugues answered 9/7, 2015 at 7:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.