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:
- 在您的 app/Http 目录中,创建一个 helpers.php 文件并添加您的函数。
- 在 composer.json 内,在自动加载块中,添加 "files":["app/Http/helpers.php"].
- 运行 作曲家转储自动加载。
您可以阅读更多信息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 数据库)但是您不必更改应用程序中的方法调用
我在多个文件中有以下代码。我想把它擦干。
代码的目的是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:
- 在您的 app/Http 目录中,创建一个 helpers.php 文件并添加您的函数。
- 在 composer.json 内,在自动加载块中,添加 "files":["app/Http/helpers.php"].
- 运行 作曲家转储自动加载。
您可以阅读更多信息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 数据库)但是您不必更改应用程序中的方法调用