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

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

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

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]删除
    最新教程 更多>
    • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
      在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
      在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。为了解决此问题,您正在尝试使用“ mb_convert_encoding”和“ iconv”转换受...
      编程 发布于2025-04-24
    • Java是否允许多种返回类型:仔细研究通用方法?
      Java是否允许多种返回类型:仔细研究通用方法?
      在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
      编程 发布于2025-04-24
    • 如何限制动态大小的父元素中元素的滚动范围?
      如何限制动态大小的父元素中元素的滚动范围?
      在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
      编程 发布于2025-04-24
    • 如何处理PHP文件系统功能中的UTF-8文件名?
      如何处理PHP文件系统功能中的UTF-8文件名?
      在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
      编程 发布于2025-04-24
    • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
      \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
      答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
      编程 发布于2025-04-24
    • 如何使用“ JSON”软件包解析JSON阵列?
      如何使用“ JSON”软件包解析JSON阵列?
      parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
      编程 发布于2025-04-24
    • 如何在鼠标单击时编程选择DIV中的所有文本?
      如何在鼠标单击时编程选择DIV中的所有文本?
      在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
      编程 发布于2025-04-24
    • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
      在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
      在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否需要手动调用“ delete”操作员在heap-exprogal exit exit上。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(HEAP内存)的指针。当应用程序退出时,此内存是否会自动发布?通常,是。但是,即使在这...
      编程 发布于2025-04-24
    • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
      如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
      How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
      编程 发布于2025-04-24
    • 如何在Chrome中居中选择框文本?
      如何在Chrome中居中选择框文本?
      选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
      编程 发布于2025-04-24
    • HTML格式标签
      HTML格式标签
      HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
      编程 发布于2025-04-24
    • 对象拟合:IE和Edge中的封面失败,如何修复?
      对象拟合:IE和Edge中的封面失败,如何修复?
      To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
      编程 发布于2025-04-24
    • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
      如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
      从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
      编程 发布于2025-04-24
    • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
      为什么不````''{margin:0; }`始终删除CSS中的最高边距?
      在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
      编程 发布于2025-04-24
    • 如何使用PHP从XML文件中有效地检索属性值?
      如何使用PHP从XML文件中有效地检索属性值?
      从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
      编程 发布于2025-04-24

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

    Copyright© 2022 湘ICP备2022001581号-3