如何在Symfony2中为所有控制器设置会话变量?

16

我该如何在我的控制器中创建和访问Symfony 2会话变量?我使用的是以下代码:

$session = new Session();
$session->start();
$session->set('loginUserId',$user['user_id']);

我想了解如何在所有控制器中使用上述会话变量进行访问。

3个回答

34

在Symfony控制器中使用Session的一种方法是:

设置:

$this->get('session')->set('loginUserId', $user['user_id']);

获取:

$this->get('session')->get('loginUserId');

如果您使用标准框架版本


如果我的回答有帮助到您的问题,您可以标记它为答案吗? - Gabriel Filipiak
这个方法是否适用于在所有控制器中使用那些会话变量? - Joe John
是的,它应该在所有控制器中都可以访问。 - Gabriel Filipiak
为了理解这个答案(我认为它比我的更适合即时使用),你应该写下 $this->get('session') 实际上是对 Symfony2 会话服务的调用,这就是为什么你可以从所有控制器、处理程序等调用这些变量。 - Charles-Antoine Fournel
感谢您的反馈。 - Gabriel Filipiak

12

从文档中可以了解到:

Symfony会话旨在替代几个本地PHP函数。 应用程序应避免使用session_start()、session_regenerate_id()、session_id()、session_name()和session_destroy(),而是使用以下部分中的API。

并且:

虽然建议显式启动会话,但会话实际上是按需启动的,也就是说,如果有任何会话请求来读/写会话数据,会话将自动启动。

因此,会话会自动启动,并且可以通过控制器访问:

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

或者:

public function indexAction()
{
    $session = $this->getRequest()->getSession();
    // or
    $session = $this->get('session');
    ...
}

比:

// store an attribute for reuse during a later user request
$session->set('foo', 'bar');

// get the attribute set by another controller in another request
$foobar = $session->get('foobar');

// use a default value if the attribute doesn't exist
$filters = $session->get('filters', array());

3

http://symfony.com/doc/current/components/http_foundation/sessions.html

  use Symfony\Component\HttpFoundation\Session\Session;

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

  // set and get session attributes
  $session->set('name', 'Drak');
  $session->get('name');

  // set flash messages
  $session->getFlashBag()->add('notice', 'Profile updated');

  // retrieve messages
     foreach ($session->getFlashBag()->get('notice', array()) as $message) {
     echo '<div class="flash-notice">'.$message.'</div>';
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接