2015-09-23 7 views
3

Я работаю над созданием небольшого CRUD-приложения в Laravel 5. У меня есть несколько настроек приложения, таких как «SiteTitle» и «BaseURL». Я бы хотел, чтобы мои администраторы менялись пользовательский интерфейс. В моем приложении используется шаблон base.blade.php, который расширяется до разных представлений + контроллеров, и именно эти параметры, скорее всего, будут использоваться.Laravel Global Settings Model

Что-то вроде:

<h1><a href="#">{{ $setting->SiteName }}</a></h1> 

У меня есть параметры, хранящиеся в таблице базы данных, которые привязаны к модели Setting.php.

Я бы предпочел не каждый из моих методов контроллера запросить базу данных для этих параметров, чтобы просто передать их шаблону base.blade.php.

Каков наилучший способ создания какой-либо глобальной переменной настройки, которую я могу использовать во всем приложении?

Заранее благодарен!

+0

Возможный дубликат [Laravel: Где хранить данные и константы глобальных массивов?] (Http://stackoverflow.com/questions/26854030/laravel-where-to-store-global-arrays-data-and-constants) – FuzzyTree

+1

Возможный дубликат [глобальная переменная для всех контроллеров и просмотров] (http://stackoverflow.com/questions/25189427/global-variable-for-all-controller-and-views) – Thomas

ответ

0

Если ваше приложение использует несколько контроллеров, вы можете определить родительский контроллер, который будет расширен всеми вашими другими контроллерами. В конструкторе родительского контроллера вы можете получить данные настроек и сохранить их в свойстве класса, которое будет доступно всем классам дочерних контроллеров. Ваши дочерние контроллеры могут просто передать эти данные в представление.

11

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

Что-то же просто, как:

class SettingsServiceProvider extends ServiceProvider 
{ 
    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->singleton('settings', function ($app) { 
      return $app['cache']->remember('site.settings', 60, function() { 
       return Setting::lists('value', 'key')->toArray(); 
      }); 
     }); 
    } 
} 

Если предположить, что модель настройки называется Setting согласно соглашениям об именовании Laravel в. Вы можете получить доступ к настройкам, как так:

<h1>{{ array_get(app('settings'), 'site.name') }}</h1> 

Если вы хотели покрасивее способ доступа настройки, можно создать вспомогательную функцию:

function setting($key) 
{ 
    return array_get(app('settings'), $key); 
} 

Что бы сделать использование так:

<h1>{{ setting('site.name') }}</h1> 

Практическое использование эмулятора config().

+0

Очень элегантное решение, спасибо! Имейте в виду, что если вы начинаете с пустого значения, кеш, установленный на 60 минут, будет оставаться пустым, даже если ваша база данных имеет более новое значение. Для обновления кеша используйте 'Cache :: forget ('site.settings'); в artisan tinker.' – raphael

+0

@raphael Вы можете добавить наблюдателя в модель 'Setting', которая очищает кеш при сохранении. –

+0

В laravel 5.3 метод 'lists()' обесценивается. Итак, используйте 'pluck()' вместо o list. – Drudge