Не удалось запустить сеанс: PHP уже запущен (установлено значение $_SESSION). 500 Внутренняя ошибка сервера — RuntimeException

Я пытаюсь реализовать простую страницу входа в систему для моего пакета управления пользователями, и я новичок в создании формы через конструктор форм. В моем пакете есть только 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'));
            }   
        }
    }

Когда я попытался реализовать интерфейс formbuilder внутри своей функции, я внезапно столкнулся с этим по сравнению с обычным созданием из html, с которым у меня вообще не возникло проблем. Есть ли проблема с моим кодом? потому что я попробовал этот код входа в систему через HTML и преобразовал его в компонент formbuilderinterface Symfony.


person Cedric    schedule 22.01.2014    source источник


Ответы (2)


Symfony2 по умолчанию автоматически запускает сессии за вас.

Нет необходимости в $session = new Session();

Попробуй это,

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

Ссылка: http://symfony.com/doc/current/book/controller.html#managing-the-session

person Krish R    schedule 22.01.2014
comment
Я что-то пропустил в своем ответе? - person Krish R; 22.01.2014
comment
извините, я попытался опубликовать тот, который я прокомментировал, в качестве ответа .. но, кажется, вы уже указали на это. Я удалил его и отметил ваш ответ как правильный. Ваше здоровье! - person Cedric; 22.01.2014
comment
документ Symfony упоминает об этом? Или почему это не так? - person ArchLinuxTux; 18.06.2018

Ты делаешь это неправильно !

Я потратил некоторое время на поиск решения этой проблемы и в итоге сделал то же самое (используя Request $request ) в functionAction() для отправки переменной сеанса в шаблон.

Однако все это неправильно. TWIG может напрямую обращаться ко всем переменным сеанса, вам не нужно передавать какую-либо переменную в TWIG render().

Чтобы решить исходную проблему, вы должны сохранить поведение indexAction() по умолчанию без параметра и удалить «массив ('токен' => $session->get ('токен'))» из вашего вызова рендеринга TWIG.

Единственное, что нужно знать, это то, что вы можете вызвать переменную сеанса «токен» непосредственно в своем шаблоне, используя: {{ app.session.get('token') }}

И да будет волшебство! Так просто !

person tenac    schedule 09.07.2015