[英]Symfony legacy session issues, porting a massive project slowly
好的,我们有这个MASSIVE裸机php项目,我们想慢慢转换成Symfony3
这是一个不断变化和更新的项目,所以我们需要透明,以确保不会破坏使用它的人。 他们根本不应该注意到差异。
所以我们决定尝试的解决方案是这样的:
问题在于Legacy Bridge的配置带来的痛苦,以及一些选择 堆栈 溢出的答案并没有让我们处于任何地方。
使用桥梁
正如此doc所说的那样配置桥接器并没有影响任何东西,除了它正在读取的会话没有添加到$_SESSION['_sf2_attributes']
assoc或其他任何地方。
使用Bridge组件
根据描述使用PhpBridgeSessionStorage
组件的本文档 ,在配置时,将按以下方式输出:
classes.php第83行中的ContextErrorException:警告:ini_set():会话处于活动状态。 您目前无法更改会话模块的ini设置
当我将它与第一种方法结合起来时,它就变成了第一种方法。 它工作正常,但我在我的symfony控制器中看到遗留应用程序中的会话数据集绝对没有
DefaultController.php on line 16:
array:3 [▼
"_sf2_attributes" => & []
"_sf2_flashes" => & []
"_sf2_meta" => & array:3 [▼
"u" => 1469839893
"c" => 1469836213
"l" => "0"
]
]
DefaultController.php on line 17:
Session {#2519 ▼
#storage: PhpBridgeSessionStorage {#2520 ▼
#bags: array:2 [▼
"attributes" => AttributeBag {#2218 ▼
-name: "attributes"
-storageKey: "_sf2_attributes"
#attributes: & []
}
"flashes" => FlashBag {#2219 ▼
-name: "flashes"
-flashes: & []
-storageKey: "_sf2_flashes"
}
]
#started: true
#closed: false
#saveHandler: SessionHandlerProxy {#2522 ▼
#handler: SessionHandler {#2217}
#wrapper: true
#saveHandlerName: "files"
}
#metadataBag: MetadataBag {#2521 ▼
-name: "__metadata"
-storageKey: "_sf2_meta"
#meta: & array:3 [▼
"u" => 1469839893
"c" => 1469836213
"l" => "0"
]
-lastUsed: 1469839892
-updateThreshold: "0"
}
}
-flashName: "flashes"
-attributeName: "attributes"
}
但是当在app/config/services.yml
设置和设置监听器时,如下所示: services: session.legacy: class: AppBundle\\Session\\LegacySessionHandler tags: - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
我们得到这样的错误:
NativeSessionStorage.php第240行中的LogicException:在会话已启动时无法注册包。
我理解这个解决方案正在尝试做什么,但它解决了我身边的两个问题:
我觉得,当kernel.request
触发并且我的类方法被调用时,该事件应该仍然可以看到存储在$_SESSION
超全局中的symfony上下文之外的实际真实数据集。 因为它应该通过$ _SESSION assoc循环并将该数据应用到新的包。
第一个问题是没有什么可设置的。 在侦听器必须使用的会话关联中找到的遗留应用程序中没有密钥集
第二个问题是,由于某种原因,我被阻止注册一个新的包......
因为当var_dump
$_SESSION
超全局时,我可以在遗留应用程序中看到像_sf2_attributes
这样的键,我决定嘿,为什么不让验证者将它的密钥转储到_sf2_attributes
键而不是根目录!
这也不起作用。 就像,完全一样。 没有一个出现在我的symfony控制器中。
我靠近我的智慧结束了。 这是一个错误,这是设计的吗?
我遇到了同样的问题并通过在config.yml中添加它来解决它:
session:
storage_id: session.storage.native
handler_id: session.handler.native_file
save_path: ~
为了调试,我在两个地方使用了以下PHP代码:1)在遗留脚本中。 2)在symfony控制器中。
$sessPath = ini_get('session.save_path');
$sessCookie = ini_get('session.cookie_path');
$sessName = ini_get('session.name');
echo '<br>sessPath: ' . $sessPath;
echo '<br>sessCookie: ' . $sessCookie;
echo '<br>sessName: ' . $sessName;
我的问题是symfony与遗留应用程序的session.save_path不同。 因此,symfony代码无法访问我的旧$ _SESSION变量。
添加,以下行config.yml修复了问题:
save_path:〜
修复此问题后,symfony控制器代码可以直接看到所有$ _SESSION变量:
echo "<pre>"; print_r($_SESSION); echo "</pre>";
不需要在其他stackoverflow问题中提到的“类LegacySessionHandler实现EventSubscriberInterface”解决方案。 (这个问题的第3部分)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.