17

我正在尝试为我的 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 组件。

4

2 回答 2

49

Symfony2 默认情况下会自动为您启动会话。

没有必要$session = new Session();

尝试这个,

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

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

于 2014-01-22T06:51:44.457 回答
1

你这样做是错的 !

我一直在浪费时间寻找该问题的解决方案,并最终在 functionAction() 中做同样的事情(使用 Request $request )将会话变量发送到模板。

然而这一切都是错误的。TWIG 能够直接访问所有会话变量,您不需要在 TWIG 渲染()中传递任何变量。

要回答最初的问题,您应该保留 indexAction() 不带参数的默认行为,并从 TWIG 渲染调用中删除“ array('token' => $session->get('token')) ”。

唯一要知道的是,您可以直接在模板中调用会话变量“token”,使用:{{ app.session.get('token') }}

让魔法成为现实!就这么简单!

于 2015-07-09T07:25:56.817 回答