Laravel Как высушить этот код?

У меня есть следующий код в нескольких файлах. Я хотел бы высушить это.

Целью кода является возвращение значения текущей недели, которое может быть от 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();

1

Решение

В Laravel хорошей практикой является создание слоя абстракции над БД с использованием репозитория:

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, потому что вы пишете свои запросы только в своем классе репозитория, и вы можете получить к ним доступ везде, вызывая методы репозитория

Вы также можете подумать о том, чтобы ваш репозиторий реализовал интерфейс, и вы получите гибкость, потому что в будущем вы могли бы использовать другую реализацию репозитория (например, для доступа к базе данных mongodb), но вам не придется изменять вызовы методов. в вашем приложении

3

Другие решения

Я думаю, вы можете использовать для этого черты PHP или, что еще лучше, создать класс Helper и использовать свой код оттуда.

Например, я использую 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, карта классов

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. Запустите composer dump-autoload.

Вы можете прочитать больше информации Вот.

Удачи!

0

По вопросам рекламы [email protected]