- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个网络应用程序,允许人们与老师预约时间。按照目前的情况,一旦将时间添加到用户购物车中,其他人就无法看到该时间可用或将其添加到他们的购物车中。
我正在使用 darryldecode's shopping cart只要 session 持续(2 小时),项目就会存储在其中。但是,我希望项目在添加 5 分钟后自动从中删除。为了实现这一点,我设置了一个延迟 5 分钟的排队作业。
我的问题是,该作业会更改时间以在 5 分钟后再次对其他用户可见,但不会将他们从购物车中删除,因为它似乎无法访问存储购物车数据的 session 。谁能建议我如何从排队的作业中访问存储在 session 中的购物车数据?谢谢。
这是工作的代码,除了 Cart::remove() 之外一切正常
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\TimeSlot;
use Cart;
class RemoveTimeSlotFromCart extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
public $timeSlot;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(TimeSlot $timeSlot)
{
$this->timeSlot = $timeSlot;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$timeSlot = $this->timeSlot;
if ($timeSlot->booked == 0 && $timeSlot->in_basket == 1) {
$timeSlot->in_basket = 0;
$timeSlot->save();
Cart::remove($timeSlot->id);
}
}
}
最佳答案
Cron 作业在新 session 中运行。您的购物车库 (darryldecode/laravelshoppingcart) 是基于 session 的。如果它不是来自当前用户的浏览器启动的 session ,那么更改 session 数据将非常困难(也许不可能?取决于您的 session 驱动程序)。具体来说,这一行:
Cart::remove($timeSlot->id);
购物车模型无法知道要从哪个购物车中取出商品。从用户体验的角度来看——你会想要给用户一些反馈,告诉他们他们的时间段已经被取消了;因此,在每个页面绘制(或通过 js 异步)编写删除检查不应该是意外的工作。
在绘制的每个页面上,遍历访问者购物车中的每个项目。我不知道您是如何构建 cart::add(...) 来处理唯一的购物车商品 ID,因此这假设时间段 ID 与购物车商品 ID 匹配。
$removed = [];
foreach(Cart::getContent() as $item) {
$timeSlot = timeSlot::findOrFail($item->id);
if( $timeSlot->in_basket === 0 ) {
Cart::remove($timeSlot->id);
}
}
if(count($removed)) {
//inject a HTML/JS popup message like "your timeslot has been dropped because you're too slow
//or pass it along into the request
$request->session()->flash('slots-dropped', $removed);
}
这最好在 cartUpdate 中间件中处理,但也可以在 Controller 中完成,具体取决于您站点的复杂性。
[编辑]由于数据库结构,上述解决方案存在缺陷——用户A预订了一个时间段但没有在结账窗口内结账,时间段在用户A注意到之前几分钟返回到“不在购物车”状态;同时,在用户 B 返回到可用时隙池之后和用户 A 查看另一个页面之前(并且购物车使用适当的消息更新)之前,用户 B 看到了相同的时隙。此时时间段在 B 的购物车中。当页面刷新查看人员 A 的时间段是否在“任何”购物车中时 - 它说“是的,它在购物车中,因为 $timeslot->in_basket == 1 ”。人 A 继续结帐并获得时间段,即使它在人 B 的购物车中。
解决这个问题的方法非常简单——将 in_basket 的数据类型从 bool 值更改为字符串,并在每次将其添加到购物车时为其分配 session_id 的值。从我在购物车类中看到的,这可能是 app()->session->get('session')。你 var_dump(app()->session->all()) 看看这是否正确,然后再 promise 重构它。更新后的解决方案将如下所示:
$removed = [];
foreach(Cart::getContent() as $item) {
$timeSlot = timeSlot::findOrFail($item->id);
if( $timeSlot->in_basket !== app()->session->get('session') ) {
Cart::remove($timeSlot->id);
}
}
if(count($removed)) {
//inject a HTML/JS popup message like "your timeslot has been dropped because you're too slow
//or pass it along into the request
$request->session()->flash('slots-dropped', $removed);
}
关于php - 尝试从 Laravel 5.2 中的排队作业访问 session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37417559/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!