gpt4 book ai didi

php - Symfony 2 和遗留应用程序的自定义 session 变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:37:55 25 4
gpt4 key购买 nike

我正在设置从 Legacy 代码库迁移到 Symfony 代码库的能力,我正在尝试在两个应用程序之间共享遗留 session 变量。

我目前可以在app_dev.phpvar_dump($_SESSION) 并且user_id 键来自遗留应用程序。但是,当我在 Controller 中运行以下命令时,我没有获得任何 session 变量:

var_dump($request->getSession()->all());

澄清一下,我目前可以访问 $_SESSION['user_id'],因此 session 在应用程序之间成功共享,但是 Symfony session 对象和它的参数包不包含旧 key 。

我的目标:

  • user_id 键在 $request->getSession() 调用中可用
  • 所有其他 key 都在这里可用

我的问题:

我试过 PHP Session bridge但我认为这不应该做我想做的事。添加 bridge 参数不仅在我的 Symfony 应用程序中没有任何作用,而且从我的应用程序中也没有做任何事情 read这意味着以某种方式在其他遗留应用程序中使用,而不是在 Symfony 中。

Symfony sessions store data like attributes in special 'Bags' which use a key in the $_SESSION superglobal. This means that a Symfony session cannot access arbitrary keys in $_SESSION that may be set by the legacy application, although all the $_SESSION contents will be saved when the session is saved. [From Integrating with legacy sessions]

我也看过 TheodoEvolutionSessionBundle , 但这是旧的,没有得到积极支持或处理,并且不适用于 Symfony 3。

我注意到 Symfony 将其 session 数据存储在 $_SESSION['_sf2_attributes'] 下,所以我最初的想法是在 app_dev.php 中执行此操作:

$_SESSION['_sf2_attributes']['user_id'] = $_SESSION['user_id'];

显然是错误的做法,因为我还必须在其中调用 session_start()

我如何将遗留的 $_SESSION 数据迁移到 Symfony 的 Session 对象中?Symfony 是否有一些内置的东西来帮助解决这个问题或可用的包?如果没有,哪里我可以将我的自定义 $_SESSION['_sf2_attributes'] 'hack' 放在正确的位置来处理所有这些 key 的迁移?

最佳答案

Symfony 在 session 中引入了 session 包的概念,所以一切都在命名空间中。没有用于访问非命名空间 session 属性的内置解决方案。

解决方案是使用标量包,就像TheodoEvolutionSessionBundle做。我不会直接使用它,而是实现一些对你的项目有用的定制(无论如何它们只为 symfony1 和 codeigniter 提供集成)。以他们的想法为基础,但根据您的需要进行调整。

或者,您可以实现一个 kernel.request 监听器,将遗留 session 属性重写为 Symfony 的:

if (isset($_SESSION['user_id'])) {
$event->getRequest()->getSession()->set('user_id', $_SESSION['user_id']);
}

Jim 的编辑

我在 kernel.request 上创建了一个事件监听器 - 每个传入的请求,我们循环遍历 $_SESSION 中的所有遗留 session 变量,并将它们放入 Symfony 的 session 中包。这是听众:

namespace AppBundle\Session;

use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag,
Symfony\Component\EventDispatcher\EventSubscriberInterface,
Symfony\Component\HttpKernel\Event\GetResponseEvent,
Symfony\Component\HttpKernel\KernelEvents;

class LegacySessionHandler implements EventSubscriberInterface
{
/**
* @var string The name of the bag name containing all the brunel values
*/
const LEGACY_SESSION_BAG_NAME = 'old_app';

/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'onKernelRequest'
];
}

/**
* Transfer all the legacy session variables into a session bag, so $_SESSION['user_id'] will be accessible
* via $session->getBag('old_app')->get('user_id'). The first bag name is defined as the class constant above
*
* @param GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event)
{
/** There might not be a session, in the case of the profiler / wdt (_profiler, _wdt) **/
if (!isset($_SESSION))
{
return;
}

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

/** Only create the old_app bag if it doesn't already exist **/
try
{
$bag = $session->getBag(self::LEGACY_SESSION_BAG_NAME);
}
catch (\InvalidArgumentException $e)
{
$bag = new NamespacedAttributeBag(self::LEGACY_SESSION_BAG_NAME);
$bag->setName(self::LEGACY_SESSION_BAG_NAME);
$session->registerBag($bag);
}

foreach ($_SESSION as $key => $value)
{
/** Symfony prefixes default session vars with an underscore thankfully, so ignore these **/
if (substr($key, 0, 1) === '_' && $key !== self::LEGACY_SESSION_BAG_NAME)
{
continue;
}

$bag->set($key, $value);
}
}
}

如以下评论中所述,这不一定是执行此操作的最佳方法。但它有效。

关于php - Symfony 2 和遗留应用程序的自定义 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35601629/

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