gpt4 book ai didi

symfony - 如何在symfony2的 View 中获取 session 变量

转载 作者:行者123 更新时间:2023-12-04 08:50:33 28 4
gpt4 key购买 nike

感谢您的宝贵建议

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

这是我的登录系统 Controller

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

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

最佳答案

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

从 symfony2 中的 PHP 模板访问 session :

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

session 处理

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

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

在 symfony2 标准版中,您可以通过以下方式从 Controller 中获取 session :

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

由于您已经将请求作为参数作为 successAction 的参数,因此您可以通过以下方式访问 session :

$session = $request->getSession();

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

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

获取值:

$session->get('key');

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

$session->save();

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

Symfony API

在注册的 SessionBag 中 - 它实现了 AttributeBagInterface - 您可以根据需要获取和设置您的键/值。

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

你可以使用:

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

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

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

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

$user = $this->getUser();

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

将 Controller 定义为服务并注入(inject)@security.context:

YAML:

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

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

供应商\YourBundle\Controller\successController:

protected $securityContext;

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

然后在你的行动中:

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

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

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

注意...您也可以使用 "@session"

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

注意注入(inject)整个容器会占用大量资源。高级开发人员一个一个地注入(inject)他们需要的服务,而不是整个容器。

提示:通常 Controller 类的首字母大写 - 例如:*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
{
[...]
}

关于symfony - 如何在symfony2的 View 中获取 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16669110/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com