Laravel / MVC:返回部分响应数据的位置

时间:2015-09-14 23:27:30

标签: php laravel model-view-controller

编辑:这个问题更多的是关于如何在函数中创建契约。如何创建简单的方法并在对象之间有需求的方法?我:

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移动到我的控制器,但这确实是业务逻辑,我想确保在启动计时器时不存在运行计时器。

我可以在这个类中创建另一个方法来解决返回问题,但是我如何保证每次启动调用都会检查运行的计时器?

1 个答案:

答案 0 :(得分:1)

这似乎非常适合使用here所述的存储库模式。

我最近不得不解决类似的问题,因为我刚开始使用Laravel而且我将所有业务逻辑都放在ModelController类中。我的业务逻辑似乎对其中任何一个都没有意义,经过一些研究后我发现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,请进行后续调用以拉取最新的计时器并根据该数据重置页面元素。有可能实现推送(从服务器)的方法,但我还不熟悉这些技术。