考虑以下示例:
用户单击一个按钮,该按钮发送某种请求返回开始一个任务,该任务在30分钟后完成。在前端,我们显示一个计时器,倒计时30分钟。
如果用户停留30分钟,则会发生其他事情。如果用户离开、注销或关闭浏览器,计时器应该仍在运行,但这次是在后端。
我知道在这种情况下,我会使用Laravel的事件/通知系统来处理整个按钮被点击,让我们设置计时器并在完成时通知。但是我怎么监控当你离开的时候X发生了当你重新登录或者回来的时候(30分钟后)有一个通知
从本质上讲,你如何复制那些带有计时器的"游戏",允许你离开并返回,而计时器(在现实世界的时间)已经下降?
我会考虑将Middleware
与数据库结合使用。
创建Middleware
用于跟踪用户的活动,并将其应用于要跟踪用户的路由:
class TouchOnline
{
/**
* The user
*
* @var $user
*/
protected $user;
/**
* Create a new session middleware
*
* @return void
*/
public function __construct()
{
$this->user = Auth::user();
}
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// Update their timestamp
if (count($this->user)) $this->user->touchOnline();
// Continue with request
return $next($request);
}
}
在您的User
模型中,您将需要:
- 更新last_active属性的方法 设置time_limit属性的方法比较两者的方法
可能看起来像:
class User extends Authenticatable
{
/**
* Update a user's last_active time
*
* @return void
*/
public function touchOnline()
{
$this->last_active = $this->freshTimestamp();
$this->save();
}
/**
* Set a user's time_limit
*
* @return integer
*/
public function setTimeLimit()
{
$this->time_limit = Carbon::now()->addMinutes(30);
$this->save();
}
/**
* Sort if user has lapsed over time_limit
*
* @return bool
*/
public function isUserOverTimeLimit()
{
$last_active = $this->last_active;
$time_limit = $this->time_limit;
if ($last_active > $time_limit) return true;
return false;
}
}
做得很粗略,但应该给你指明正确的方向。希望能有所帮助!