- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在设置从 Legacy 代码库迁移到 Symfony 代码库的能力,我正在尝试在两个应用程序之间共享遗留 session 变量。
我目前可以在app_dev.php
中var_dump($_SESSION)
并且user_id
键来自遗留应用程序。但是,当我在 Controller 中运行以下命令时,我没有获得任何 session 变量:
var_dump($request->getSession()->all());
澄清一下,我目前可以访问 $_SESSION['user_id']
,因此 session 在应用程序之间成功共享,但是 Symfony session 对象和它的参数包不包含旧 key 。
我的目标:
user_id
键在 $request->getSession()
调用中可用我的问题:
我试过 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/
我正在为一个站点构建 flexbox,而新版本非常棒——完全按预期工作。但是,因为我们使用 wkhtmltopdf 呈现为 PDF,所以看起来我们需要暂时支持遗留 (webkit-*) flexbox
我有一个遗留的 GDB 命令脚本,用于基于 Python 2.6 源代码附带的 GDB 脚本获取 Python 堆栈跟踪(所以不允许超链接,但这是 URL:http://#%20http ://svn
$ sudo apt-get 安装 nodejs-legacy阅读包裹 list ...完成构建依赖树 正在读取状态信息...完成E: 无法定位包 node-legacy 请提出解决方案... 最佳答
我最近有幸获准在中型遗留代码库(从 3.x 到 5.2)中更改 Hibernate 依赖项(以及其他)的版本。代码本身已有 10 多年的历史,但仍在日常使用中。 因此,即使在增加版本并将尽可能多的 A
我正在尝试在 Debian GNU/Linux 稳定系统上编译一些较旧的 C++ 代码(可能来自 2001-2002 年左右)。编译时出现错误: In file included from /usr/
为 unix 上的一些遗留 c/c++ 代码寻找代码分析工具专门用于识别对 的依赖 具体职能 特定(包括?)文件 文件/套接字 I/O 调用等 来自根等的函数依赖树 最佳答案 Doxygen 可能就是
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
我必须从遗留的 Visual Basic 软件中复制一个算法,但有一点我不理解代码。 作者似乎使用了某种方式通过引用隐式传递整数等简单数据类型。第一次我认为它可能是原始软件中的错误,但第三次出现后它看
我需要以编程方式最小化和最大化全屏 16 位应用程序。不幸的是,DosBox 不是一个选项,因为这个应用程序与 DosBox 不支持的一些外围设备对话。 我能够编写可以设置焦点、发送 alt + en
我想拦截对遗留 Java servlet/JSP 应用程序的请求,并使用 OpenID Connect (OIDC) 协议(protocol)对用户进行身份验证。 我看过 Spring Securit
我有一个遗留的 tomcat Java 应用程序(Spring、Hibernate、MySQL) 在 Linux (Ubuntu) 上运行。我想(需要)利用现有应用程序的后端数据库构建一个 Andro
我刚刚更新了我们的应用程序以使用最新版本的遗留 NVP API,并发现提到了巴西显然需要的两个新字段(TAXIDTYPE、TAXID)。这些显然是在我们之前使用的 API 版本之后引入的。 我只是尝试
我正在使用 g++ 4.4.7 编译一段非常古老的遗留代码。关于这段代码,我真正知道的是它是在 Irix/Sun 系统上开发的,这意味着它具有 MIPS 体系结构。我在使用这段代码时发现的一件相当奇怪
我们正在考虑使用托管 C++ 为一些遗留 C++ 库编写 .Net 可调用包装器。 这一切看起来都很简单。有什么需要注意的吗? 最佳答案 我发现在 C++/CLI 中包装一些现有的 C++ 库通常很容
好的,我们有了这个庞大的裸机 php 项目,我们想慢慢将其转换为 Symfony3 这是一个不断变化和更新的项目,因此我们需要它是透明的,以确保不会干扰使用它的人。他们根本不应该注意到差异。 所以我们
我们有一个中型 Java 应用程序需要一些重构。 我们正在考虑迁移到 JRuby on Rails。主要是因为 Ruby on Rails 提供的生产力以及许多将重新实现 Web 逻辑的现有插件。 但
我的问题是关于经典 ASP,而不是 ASP.Net。我在这里询问专家,因为搜索引擎总是告诉我 ASP.Net 答案。我的困惑是, 如何在经典 ASP 代码中或通过配置设置 session 过期时间?
在十多年没有用 C++ 编程之后,我正在尝试向遗留的 C++ Win32 DLL 添加正确的错误报告。 这有力地提醒了我们在 C/C++ 中处理空终止字符串的令人难以置信的单调乏味——更不用说潜在的缓
我必须获得一些在 Windows 10 下运行的遗留 (XP) MFC 代码。它在 Windows 7 下运行良好。我没有尝试过任何其他版本。 想法是内存中有一个缓冲区,其中包含 RGB 格式的图像像
require('url').parse('someurl.com/page') 已仅在文档中被弃用,我们严格的 linter 对此感到不满...我尝试在我们的代码中将其替换为互联网建议的 new U
我是一名优秀的程序员,十分优秀!