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

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

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

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]删除
    最新教程 更多>
    • 如何高效地在一个事务中插入数据到多个MySQL表?
      如何高效地在一个事务中插入数据到多个MySQL表?
      mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
      编程 发布于2025-05-07
    • 如何实时捕获和流媒体以进行聊天机器人命令执行?
      如何实时捕获和流媒体以进行聊天机器人命令执行?
      在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
      编程 发布于2025-05-07
    • 人脸检测失败原因及解决方案:Error -215
      人脸检测失败原因及解决方案:Error -215
      错误处理:解决“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“检测”中的错误:在功能检测中。”当Face Cascade分类器(即面部检测至关重要的组件)未正确加载时,通常会出现此错误。要解决此问题,必须...
      编程 发布于2025-05-07
    • 您如何在Laravel Blade模板中定义变量?
      您如何在Laravel Blade模板中定义变量?
      在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
      编程 发布于2025-05-07
    • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
      为什么我会收到MySQL错误#1089:错误的前缀密钥?
      mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,以便更快地搜索这些前缀。理解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
      编程 发布于2025-05-07
    • 如何使用组在MySQL中旋转数据?
      如何使用组在MySQL中旋转数据?
      在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
      编程 发布于2025-05-07
    • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
      如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
      appEngine静态文件mime type override ,静态文件处理程序有时可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for file for file for [File]。 application/application/octet...
      编程 发布于2025-05-07
    • 反射动态实现Go接口用于RPC方法探索
      反射动态实现Go接口用于RPC方法探索
      在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
      编程 发布于2025-05-07
    • 为什么尽管有效代码,为什么在PHP中捕获输入?
      为什么尽管有效代码,为什么在PHP中捕获输入?
      在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
      编程 发布于2025-05-07
    • PHP SimpleXML解析带命名空间冒号的XML方法
      PHP SimpleXML解析带命名空间冒号的XML方法
      在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
      编程 发布于2025-05-07
    • 哪种在JavaScript中声明多个变量的方法更可维护?
      哪种在JavaScript中声明多个变量的方法更可维护?
      在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
      编程 发布于2025-05-07
    • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
      在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
      在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
      编程 发布于2025-05-07
    • `console.log`显示修改后对象值异常的原因
      `console.log`显示修改后对象值异常的原因
      foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
      编程 发布于2025-05-07
    • 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-05-07
    • 如何在GO编译器中自定义编译优化?
      如何在GO编译器中自定义编译优化?
      在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
      编程 发布于2025-05-07

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

    Copyright© 2022 湘ICP备2022001581号-3