Laravel 如何干掉这段代码?

Laravel How to DRY Up This Code?

我在多个文件中有以下代码。我想把它擦干。

代码的目的是return当前周的值,可以是1到17。

型号Schedule.php

public function scopeCurrentWeekGames($query) {

    return $query->where('week', '=', $this->currentWeek());
}

public function currentWeek()
{
    $currentWeek = Schedule::distinct()
                        ->where('gameTime', '<', Carbon::now()->addHours(50))
                        ->orderBy('gameTime', 'desc')
                        ->lists('week')
                        ->first();

    return $currentWeek;
}

型号Pick.php

public function scopeCurrentWeekPicks($query) {

    $currentWeek = Schedule::distinct()
                        ->where('gameTime', '<', Carbon::now()->addHours(50))
                        ->orderBy('gameTime', 'desc')
                        ->lists('week')
                        ->first();

    return $query->where('week', '=', $currentWeek);
}

控制器PicksController.php

    $currentWeek = Schedule::distinct()
                        ->where('gameTime', '<', Carbon::now()->addHours(50))
                        ->orderBy('gameTime', 'desc')
                        ->lists('week')
                        ->first();

我认为,您可以为此使用 PHP traits,或者更好的是,创建 Helper class,然后从那里使用您的代码。

例如,我正在使用 Laravel 4.2 并且我的 Helper.php 存储在 app/libraries/:

<?php

namespace App\Libraries;

class Helper
{
    /**
     * @param $string
     *
     * @return mixed
     */
    public static function stringToBool($string)
    {
        return filter_var($string, FILTER_VALIDATE_BOOLEAN);
    }
}

并且不要忘记将 app/libraries 放入 composer.json、classmap

section:
    "autoload": {
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/services",
            "app/models",
            "app/parsers",
            "app/libraries", // Check if isset or add.
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php"
        ]
    },

对于Laravel 5.1:

  1. 在您的 app/Http 目录中,创建一个 helpers.php 文件并添加您的函数。
  2. 在 composer.json 内,在自动加载块中,添加 "files":["app/Http/helpers.php"].
  3. 运行 作曲家转储自动加载。

您可以阅读更多信息here

祝你好运!

在 Laravel 中,使用存储库在 DB 上创建抽象层是一个很好的做法:

class ScheduleRepository 
{

    public function getCurrentWeek()
    {
        $currentWeek = Schedule::distinct()
                       ->where('gameTime', '<', Carbon::now()->addHours(50))
                       ->orderBy('gameTime', 'desc')
                       ->lists('week')
                       ->first();

        return $query->where('week', '=', $currentWeek);
    }

    /* 
    Here other methods to access the Schedule model, i.e:   
    public function getAll()
    {
        //return all schedule models...
    } 
    */

}

然后,例如在您的控制器中:

class PicksController extends Controller {

    protected $schedule;

    //inject your repository where you need it
    public function __construct( ScheduleRepository $schedule )
    {
        $this->schedule= $schedule;
    }

    public function index()
    {
        //call a method on the repository
        $week = $this->schedule->getCurrentWeek();

        //do whathever you want with week...
    }

}

使用这种方法,您可以保持代码 DRY,因为您只在存储库中编写查询 class,并且可以通过调用存储库在任何地方访问它们方法

您还可以考虑让您的存储库实现一个接口,这样您将获得灵活性,因为将来您可以使用存储库的另一个实现(例如访问 mongodb 数据库)但是您不必更改应用程序中的方法调用