编辑:这个问题更多的是关于如何在函数中创建契约。如何创建简单的方法并在对象之间有需求的方法?我:
1)在start()方法中添加检查和异常以创建合同并将暂停循环放在另一个调用中? (这里的下方是对数据源的轻微重复调用。)
2)每当启动计时器创建合约时,都会添加一个事件监听器? (我不确定我是否可以按照我希望的方式返回数据。我也不确定我能保证在启动新计时器之前事件会成功完成。可能并不重要在这种情况下。)
3)只需从start函数返回id并处理它们。 (该功能将做得太多,但至少它会以较少的开销正常工作。)
=============================================== =========================
我的模型中有这个代码。这是一个计时器应用程序,启动计时器时会触发此代码。基本上,任何运行的计时器都应该暂停,并且某种程度上视图需要理解它应该刷新那些计时器。
public function start($input = array())
{
if($timers = TimeLog::where('status','running')->get()){
foreach($timers as $timer){
/** @var $timer TimeLog **/
$timer->pause();
}
}
$this->user_id = Auth::user()->id;
$this->addDetails($input);
$this->restarted_at = date('Y-n-d H:i:s'); //TODO timezones
$this->status = 'running';
$this->save();
}
我很难从这个函数返回暂停的计时器列表。似乎没有意义。
我考虑将foreach移动到我的控制器,但这确实是业务逻辑,我想确保在启动计时器时不存在运行计时器。
我可以在这个类中创建另一个方法来解决返回问题,但是我如何保证每次启动调用都会检查运行的计时器?
答案 0 :(得分:1)
这似乎非常适合使用here所述的存储库模式。
我最近不得不解决类似的问题,因为我刚开始使用Laravel而且我将所有业务逻辑都放在Model
或Controller
类中。我的业务逻辑似乎对其中任何一个都没有意义,经过一些研究后我发现Repositories
。
我会尝试这样的事情:
class EloquentTimerRepository implements TimerRepository
{
/**
* Part of your TimerRepository interface
*/
public function startTimersForCurrentUser($inputs)
{
$this->pauseRunningTimers();
$newTimer = $this->createNewTimer($inputs);
$newTimer->start();
}
private function createNewTimer($inputs)
{
$timer = new Timer;
$timer->user_id = Auth::user()->id;
$timer->addDetails($input);
$timer->save();
return $timer;
}
private function getRunningTimers()
{
return TimeLog::where('status','running');
}
private function pauseRunningTimers()
{
if($this->getRunningTimers()){
foreach($timers as $timer){
/** @var $timer TimeLog **/
$timer->pause();
}
}
}
}
然后:
class Timer extends Model
{
public function start()
{
$this->restarted_at = date('Y-n-d H:i:s'); //TODO timezones
$this->status = 'running';
$this->save();
}
}
至于更新视图,您将不得不进行页面重新加载或者如果您正在使用ajax,请进行后续调用以拉取最新的计时器并根据该数据重置页面元素。有可能实现推送(从服务器)的方法,但我还不熟悉这些技术。