2014-01-22 3 views
14

Я пытаюсь реализовать простую страницу входа для моего 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 и преобразовал его в компонент formbuilderinterface Symfony.

ответ

41

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

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

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

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

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

+0

Я что-то пропустил в своем ответе? –

+0

ow sorry, я попытался опубликовать тот, который я комментирую, как ответ .. но, похоже, вы уже указали это уже. Я удалил его и пометил ваш ответ как правильный. Ура! – Cedric

+0

Спасибо @Cedric !!! –

0

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

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

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

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

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

И пусть магия будет ! Так просто !

Смежные вопросы