如何在symfony控制器中初始化会话并在视图中访问它

时间:2017-01-19 19:40:18

标签: php twig symfony

我正在使用symfony 2.7,我希望根据条件显示网站导航栏,例如登录/注销。

我没有使用数据库来登录用户,而是使用在控制器中初始化的会话。

无论如何,如何绑定此会话并确保用户看到登录/注销页面?

让我们说这是一个导航

<a href='{{ path('login') }}'> login </a>
<a href='{{ path('logout') }}'> logout </a>

这是我的控制器

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

    if ( some logic ){
        $session->set('user_ID', $someData);
    }
}

现在,简单来说,我需要一种方法来查看是否在树枝中设置了user_ID,以便显示我想要的导航链接

2 个答案:

答案 0 :(得分:1)

如果登录成功,您可以在控制器中初始化会话

$this->get('session')->set('IsAuth', true);

在使用模板引擎Twig的视图中,您可以检查会话值:

  {% if app.session.get('IsAuth')  %}
         <a href='{{ path('login') }}'> login </a>
   {% else %}
         <a href='{{ path('logout') }}'> logout </a>
  {% endif %} 

答案 1 :(得分:1)

回答您的评论,您可以尝试使用Symfony2身份验证:

在控制器中使用命名空间:UsernamePasswordToken:

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

从数据库中检索您的角色并将其存储在$ aRoleNameToken

 $aRoleNameToken = array('ROLE_ADMIN','ROLE_USER');

如果验证成功,则设置令牌:

$token = new UsernamePasswordToken($username, null,'secured_area',$aRoleNameToken);

$this->get('security.context')->setToken($token);

在视图中,您可以检查是否已将rol分配给当前用户: (http://symfony.com/doc/2.8/security.html

 {% if is_granted('ROLE_ADMIN') %}
         <a href="...">Delete</a>
 {% endif %}

退出操作:

 /**
 * @Route("/logout", name="logout")
 */
public function logoutAction() {
   $this->get('security.token_storage')->setToken(null);
   $this->get('request')->getSession()->invalidate();
   return new RedirectResponse($this->generateUrl('login'));
}

在security.yml文件中,您可以对会话进行一些配置。

    access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin, roles: [ROLE_ADMIN] }   
    - { path: ^/home, roles: [ROLE_ADMIN,ROLE_USER] } 
    - { path: ^/login, roles: [ROLE_ADMIN,ROLE_USER]}
    - { path: /, roles: [ROLE_ADMIN,ROLE_USER]}   

正如您所看到的,^ / login的值为'IS_AUTHENTICATED_ANONYMOUSLY',这意味着如果您尝试访问另一个路径,例如'/ home'或',则您无需身份验证就可以看到登录页面/ admin'并且您没有autenticathion(之前在您的登录操作中设置),您将被重定向到登录页面。

   - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }

例如,如果要访问路径,则下一句话意味着您必须具有角色ROLE_ADMIN:/ admin

- { path: ^/admin, roles: [ROLE_ADMIN] }