В одном из моих приложений у меня есть свойство, которое необходимо для всего приложения.
Для нескольких различных частей приложения требуется доступ, например запросы, локальные и глобальные области, но также и команды.
Я хотел бы «кэшировать» это свойство на время запроса.
Мое текущее решение в моем классе Game
выглядит следующим образом:
/**
* Get current game set in the .env file.
* @return Game
*/
public static function current()
{
return Cache::remember('current_game', 1, function () {
static $game = null;
$id = config('app.current_game_id');
if ($game === null || $game->id !== $id) {
$game = Game::find($id);
}
return $game;
});
}
Я могу успешно вызвать этоиспользуя Game::current()
, но это решение кажется "хакерским", и оно останется в кэше в течение нескольких запросов.
Я попытался разместить свойство в текущем объекте запроса, но это не будет доступно для команд икажется недоступным в видах лезвий и объектах (без передачи переменной $request
.
Другой пример ее использования описан ниже:
class Job extends Model
{
/**
* The "booting" method of the model.
*
* @return void
*/
protected static function boot()
{
parent::boot();
static::addGlobalScope('game_scope', function (Builder $builder) {
$builder->whereHas('post', function ($query) {
$query->where('game_id', Game::current()->id);
});
});
}
}
Я не верю, что смогу легко получить доступсвойство запроса в этом методе загрузки.
Другая моя идея - сохранить переменную на Game
фасаде, но мне не удалось найти какой-либо документОписание этой практики.
Не могли бы вы помочь мне найти метод "кэширования" свойства Game::current()
, доступный в большинстве, если не во всех этих случаях, без использования "хакерского" метода.