Не удалось запустить сеанс: уже запущен PHP (установлен$ SESSION). 500 Внутренняя Ошибка Сервера-RuntimeException
Я пытаюсь реализовать простую страницу входа для моего usermanagementbundle, и я новичок в создании формы через formbuilder. Внутри моего пакета есть только 3 функции, где есть новый сеанс, и он вызывается на разных маршрутах, даже если я удаляю другие 2, я все равно получаю ту же ошибку в нем. Вот мой код:
<?php
namespace AcmeUserManagementBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationSessionSession;
use AcmeUserManagementBundleEntityUsers;
use AcmeUserManagementBundleFormSigninType;
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 и конвертировал его в компонент formbuilderinterface Symfony.
2 ответов
Symfony2, по умолчанию, запускает сеансы для вас автоматически.
не нужно $session = new Session();
попробуйте это,
public function indexAction(Request $request)
{
$session = $request->getSession();
Ref:http://symfony.com/doc/current/book/controller.html#managing-the-session
Вы делаете это неправильно !
Я потратил некоторое время на поиск решения этой проблемы и в конечном итоге сделал то же самое ( используя запрос $request ) в functionAction (), чтобы отправить переменную сеанса в шаблон.
однако все это неправильно. TWIG может напрямую обращаться ко всем переменным сеанса, вам не нужно передавать какую-либо переменную в Twig render().
чтобы ответить на исходную проблему, вы должны сохранить поведение по умолчанию indexAction () без параметра и удалите " array ('token' => $session->get ('token')) " из вызова рендеринга TWIG.
единственное, что нужно знать, это то, что вы можете вызвать переменную сеанса "токен" непосредственно в своем шаблоне, используя : {{ app.сессия.get ('token')}}
и пусть магия будет ! Это просто !