”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 PRG 模式和闪烁进行会话处理

使用 PRG 模式和闪烁进行会话处理

发布于2024-08-05
浏览:785

Session Handling with the PRG pattern and Flashing

在我们之前的项目中,验证失败时直接从 POST 请求返回视图并不是最好的方法。

问题

当用户提交包含无效数据的登录表单时,表单会显示错误消息并将用户重定向到登录页面。但是,如果用户刷新页面或导航离开并返回到登录页面,则相同的错误消息仍然存在。

解决方案

为了解决这个问题,我们可以使用会话来存储错误并实现 PRG 模式。我们可以将错误存储在 $_SESSION 超全局变量中,并将 create.php 中的错误语句更新为:

$_SESSION['errors'] = $form->errors();
view('session/create.view.php', [ 'errors' => $_SESSION['errors'] ?? [] ]);
?? [] ]);


但即使有了这样的改变,问题仍然存在。为了解决这个问题,我们必须将 return 语句更改为:

return redirect ('/login');

返回重定向('/login');




如果发生任何错误,它会将用户移动到登录页面,但不会向用户显示错误 w
然后我们刷新 $_SESSION 超全局变量以在短时间内销毁会话:

return redirect ('/login');

$_SESSION['_flashed']['errors'] = $form->errors();

现在您可以注意到问题已解决,但要重构此代码,我们必须在类中添加 PRG 方法

会话类(PRG 模式)


为了重构,我们创建一个名为 Core/Session.php 的新文件,其中包含管理用户会话的 Session 类:

return redirect ('/login');

  • flash方法将数据存储在$_SESSION['_flash']数组中,用于会话刷新。
  • get方法检查$_SESSION['_flash']中是否有flash数据并返回。如果没有,则返回常规会话数据或默认值。
  • unflash 方法取消设置刷新的数据,使其仅可用于下一个请求。
  • PRG 模式的实现方式是使用 put 方法在会话中存储数据,重定向(例如,使用 return redirect('/login');),然后使用 get 方法在下一个请求中检索数据。

    通过使用这个 Session 类,我们可以实现 PRG 模式和会话刷新来管理用户会话并防止重复的表单提交和不需要的错误消息持久性。

    有方法


    在此文件中,has方法返回一个布尔值,指示会话中是否存在某个键:

    return redirect ('/login');
    
    
    。 公共静态函数 has($key) { return (bool) static::get($key); }

    重构注销功能


    在function.php文件中,我们重构注销函数以使用Session类:

    return redirect ('/login');
    
    
    会话::销毁();

    重构 get 方法


    由于该项目已经运行良好。但是我们需要重构 Core/Session.php 中的 get 方法,将代码合并到单个语句中:

    return redirect ('/login');
    
    
    公共静态函数 get($key, $default = null) { 返回 $_SESSION['_flash'][$key] ?? $_SESSION[$key] ?? $默认值; }

    我们今天的项目中进行了大量重构,使其外观更好、易于理解并提高代码的性能。

    希望您已经清楚地理解了!.

    版本声明 本文转载于:https://dev.to/ghulam_mujtaba_247/session-handling-with-the-prg-pattern-and-flashing-1jog?1如有侵犯,请联系[email protected]删除
    最新教程 更多>
    • 如何在php中使用卷发发送原始帖子请求?
      如何在php中使用卷发发送原始帖子请求?
      如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
      编程 发布于2025-07-05
    • Java的Map.Entry和SimpleEntry如何简化键值对管理?
      Java的Map.Entry和SimpleEntry如何简化键值对管理?
      A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
      编程 发布于2025-07-05
    • 如何使用替换指令在GO MOD中解析模块路径差异?
      如何使用替换指令在GO MOD中解析模块路径差异?
      在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
      编程 发布于2025-07-05
    • 同实例无需转储复制MySQL数据库方法
      同实例无需转储复制MySQL数据库方法
      在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
      编程 发布于2025-07-05
    • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
      eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
      称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的python功能eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
      编程 发布于2025-07-05
    • Python高效去除文本中HTML标签方法
      Python高效去除文本中HTML标签方法
      在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
      编程 发布于2025-07-05
    • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
      可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
      [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
      编程 发布于2025-07-05
    • 如何实时捕获和流媒体以进行聊天机器人命令执行?
      如何实时捕获和流媒体以进行聊天机器人命令执行?
      在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
      编程 发布于2025-07-05
    • CSS可以根据任何属性值来定位HTML元素吗?
      CSS可以根据任何属性值来定位HTML元素吗?
      靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
      编程 发布于2025-07-05
    • Spark DataFrame添加常量列的妙招
      Spark DataFrame添加常量列的妙招
      在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
      编程 发布于2025-07-05
    • Python环境变量的访问与管理方法
      Python环境变量的访问与管理方法
      Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
      编程 发布于2025-07-05
    • PHP未来:适应与创新
      PHP未来:适应与创新
      PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
      编程 发布于2025-07-05
    • 如何避免Go语言切片时的内存泄漏?
      如何避免Go语言切片时的内存泄漏?
      ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
      编程 发布于2025-07-05
    • 在PHP中如何高效检测空数组?
      在PHP中如何高效检测空数组?
      在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
      编程 发布于2025-07-05
    • PHP SimpleXML解析带命名空间冒号的XML方法
      PHP SimpleXML解析带命名空间冒号的XML方法
      在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
      编程 发布于2025-07-05

    免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

    Copyright© 2022 湘ICP备2022001581号-3