3

感谢您的宝贵建议

我创建了一个登录系统,我想将用户的 ID 存储在会话变量中

这是我的登录系统控制器

use Symfony\Component\HttpFoundation\Session\Session;

class successController extends Controller
{

public function successAction(Request $request)
    {

       --some code for form--
       $repository = $em->getRepository('RepairStoreBundle:users');
        $query = $repository->auth($name,$password);
      $error="sorry invalid username or password";   
           if($query== false)
            {
                return $this->render('RepairLoginBundle:login:login.html.php', array(
            'form' => $form->createView(),'error'=>$error,)); 
                }
        else
        {
            $role=$query[0]['role'];
            $id=$query[0]['id'];
            if($role == 1)
            {
                $session = new Session();
                $session->start();
                $session->set('id',$id);
                $result=$repository->display();
            return $this->render('RepairLoginBundle:login:success.html.php',array('result'=>$result,));
            }
            else
            {
             $session = new Session();
             $session->start();
             $session->set('id',$id);
            $res= $repository->edit($id);
        return $this->render('RepairLoginBundle:login:user.html.php',array('res'=>$res));

            }    
        }

    }

}

当管理员使用 role=1 登录时,它将呈现到 success.html.php

在这个视图中,我如何获取我在控制器中设置的会话变量。我用过 $session->get('id'); 它给了我服务器错误请帮助解决这个问题

4

1 回答 1

10

前期验证最好使用 Symfony2 中的安全组件来完成。在The Book - Security中阅读有关它的更多信息。您可能还应该看看FOSUserBundle

从 symfony2 中的 PHP 模板访问会话:

echo $app->getSession()->get('whatever');

会话处理

官方文档中有一篇文章: Components/HttpFoundation - Session Data Management

会话组件的 API 文档可以在这里找到:http: //api.symfony.com/master/Symfony/Component/HttpFoundation/Session/Session.html

在 symfony2 标准版中,您可以从控制器中获取会话:

$session = $this->getRequest()->getSession();

由于您已经将请求作为 successAction 中的参数,因此您可以使用以下命令访问会话:

$session = $request->getSession();

使用( $value 需要可序列化)设置一个值:

$session->set('key',$value);

通过以下方式获取值:

$session->get('key');

保存(和关闭)会话可以通过以下方式完成:

$session->save();

您还应该查看 SessionBag 类。您创建一个 SessionBag 并将其注册到会话中。看:

Symfony API

在已注册的 SessionBag(实现AttributeBagInterface)中,您可以根据需要获取和设置您的键/值。

提示:如果你想获取当前用户并且你有一个容器感知控制器(容器注入)

您可以使用:

$user = $this->container->get('security.context')->getToken()->getUser();

如果您在标准版中扩展 Symfony 的 Controller 类 - 较短的方法是:

$user = $this->get('security.context')->getToken()->getUser();

甚至更短(Symfony > 2.1.x):

$user = $this->getUser();

替代方案(如果您的控制器不支持容器):

将控制器定义为服务并注入@security.context:

YAML:

# src/Vendor/YourBundle/Resources/config/services.yml 

services:
    my.controller.service:
        class: Vendor\YourBundle\Controller\successController
        arguments: ["@security.context"]

供应商\YourBundle\控制器\成功控制器:

protected $securityContext;

public function __construct(SecurityContextInterface $securityContext)
{
    $this->securityContext = $securityContext;
}

然后在你的行动中:

$user = $this->securityContext->getToken()->getUser();

注意::如果您选择控制器即服务变体,您还必须在路由中使用该服务。示例 routing.yml :

[...]
route_name:
    pattern:  /success
    defaults: { _controller: my.controller.service:successAction }
    [...]
[...]

注意...您还可以使用“@session”注入会话

 # src/Vendor/YourBundle/Resources/config/services.yml 
        [...]
        arguments: ["@security.context","@session"]

笔记注入整个容器需要大量资源。高级开发人员一个接一个地注入他们需要的服务,而不是整个容器。

小费:通常控制器类的首字母大写 - 例如:*S*uccessController

一般提示:您的示例中有不必要的重复代码:

       // 'if' and 'else' execute the same stuff here
       // result: dublicate code = more code = harder to read

       if($role == 1)
        {
            $session = new Session();
            $session->start();
            [...]
        }
        else
        {
            $session = new Session();
            $session->start();
            [...]
        }    

最好是...

        // better: put this stuff before the if/else statement 

        $session = new Session();
        $session->start();

        if($role == 1)
        {
            [...]
        }
        else
        {
            [...]
        }   
于 2013-05-21T13:19:51.933 回答