请耐心解释,这是必要的。
系统背景
我正在为CMS的后端创建一个父级>子导航系统。
我构建了这样的网址:[domain.ext]/[moduleName]/[objectName]/[actionName]/[ID #1]/[ID #2]
。
解释了网址(例如example.com/PageManagement/Page/Modify/7/13
):
通过解析其组件的URL,将名称缩减为系统ID等,然后检索要在页面上显示的字段和数据来进行导航。
为了确保URL保持可读性和逻辑可理解性,我不会在URL中添加多层父ID,而是将最后几个父ID保存在PHP $_SESSION
数组中,这样我就可以了确定导航是否必须添加不同的父ID。
示例:图片我们有对象Page->Extension->Field
,它们都在模块PageManagement
中,并且从左到右为父级。现在让我们说我们有一个ID为2的页面,一个ID为8的扩展,一个ID为17的字段。编辑该字段的URL为example.com/PageManagement/Field/Modify/8/17
,因为我们正在编辑Field 17,将Extension 8作为父级。用于编辑扩展名的URL将为example.com/PageManagement/Extension/Modify/2/8
,因为我们正在编辑扩展名8,其中包含父级。编辑页面只是example.com/PageManagement/Page/Modify/2
,因为它没有父级。
问题:
现在,所有这一切都很完美。 但是,如果打开多个标签页,则它们共享相同的$_SESSION
,因此在一个标签页中导航可能会丢弃其他标签页的父标记。在 几乎 所有情况下它仍然正确,但我可以导致它的事实是不好的(因为有人可以添加/删除/编辑数据不知道他们实际上是在错误的父列表中。)
我需要什么:我需要一种方法,通过每个请求,确定它来自哪个标签,最有可能是通过为每个标签生成某种形式的UID并将其与每个请求一起发送。然后,我的系统可以按标签存储导航历史记录,而不是每个会话。
考虑解决方案
Window.sessionStorage
中(每个新窗口/选项卡都会重置)。这将允许我生成一个如果还没有设置(所以一个新的选项卡),因此每页会话存储(和记住)不同的一个。
moduleName
之前的URL。
如果有人能够解决上述解决方案中提到的问题,或者想出一个全新的解决方案,那将是惊人的。 显然,我希望尽可能少地改变URL系统的工作方式,但如果这是唯一的解决方案,那就这样吧......
答案 0 :(得分:1)
您的请求设计中存在一个基本缺陷,这会给您带来麻烦
系统应尽可能在单个请求中包含所有相关信息。在您的情况下,这意味着放弃在$_SESSION
中“记住”先前请求(状态..)的机制,而是传递请求中的所有信息。它可以在URL(“地址”和/或查询字符串)中,适当的标题(通常使用cookie。在这种情况下可能不合适)或正文(与POST表单相同的方式传递有效负载)。
选择此路径的原因有很多,仅举几例:
与往常一样,没有例外规则。在这种情况下,不适合包含在每个请求中的最常见信息是身份验证信息(用户名,密码等......)
总而言之,您应该强烈考虑重建您的请求,以便获得所有必需的信息。