Laravel - задать глобальную переменную из таблицы настроек

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

модель - настройки.в PHP

class Setting extends Model
{
    protected $table = 'settings';

    public $timestamps = false;

    protected $fillable = [
        'name',
        'value',
    ];
}

сеялка-SettingsTableSeeder.в PHP

class SettingsTableSeeder extends Seeder
{
    public function run()
    {

        $settings = [
            ['name' => 'title', 'value' => ''],
            ['name' => 'facebook', 'value' => ''],
            ['name' => 'twitter', 'value' => ''],
            ['name' => 'instagram', 'value' => '']
        ];

        foreach($settings as $setting){
            AppSetting::create($setting);
        }
    }
}

как я могу хранить все данные внутри таблицы настроек и сделать их доступными из blade или любого контроллера или представления?

редактировать


теперь, мой вопрос в том, как я могу обновить одно или несколько значений из формы?

Я установил это:

маршрут:

Route::put('/', ['as' => 'setting.update', 'uses' => 'AdminAdminConfiguracoesController@update']);

Мой АдминистраторAdminConfiguracoesController:

class AdminConfiguracoesController extends AdminBaseController
{
    private $repository;

    public function __construct(SettingRepository $repository){
        $this->repository = $repository;
    }

    public function geral()
    {
        return view('admin.pages.admin.configuracoes.geral.index');
    }

    public function social()
    {
        return view('admin.pages.admin.configuracoes.social.index');
    }

    public function analytics()
    {
        return view('admin.pages.admin.configuracoes.analytics.index');
    }

    public function update($id, Factory $cache, Setting $setting)
    {
        $this->repository->findByName($setting);

        $cache->forget('settings');

        return redirect('admin');
    }
}

Мой SettingRepository:

class SettingRepository
{
    private $model;

    public function __construct(Setting $model)
    {
        $this->model = $model;
    }

    public function findByName($name){
        return $this->model->where('name', $name)->update();
    }
}

моя форма клинка:

{!! Form::model(config('settings'), ['class' => 's-form', 'route' => ['setting.update']]) !!}
{{ method_field('PUT') }}
<div class="s-form-item text">
    <div class="item-title required">Título do artigo</div>
    {!! Form::text('title', null, ['placeholder' => 'Nome do site']) !!}
    @if($errors->has('title'))
        <div class="item-desc">{{ $errors->first('title') }}</div>
    @endif
</div>
<div class="s-form-item s-btn-group s-btns-right">
    <a href="{{ url('admin') }}" class="s-btn cancel">Voltar</a>
    <input class="s-btn" type="submit" value="Atualizar">
</div>
{!! Form::close() !!}

но вещи не работают. Как обновить значения в таблице?

3 ответов


см. улучшенный ответ в обновлении 2

Я бы добавил выделенного поставщика услуг для этого. Он прочитает все ваши настройки, хранящиеся в базе данных, и добавит их в конфигурацию Laravels. Таким образом, существует только один запрос базы данных для параметров, и вы можете получить доступ к конфигурации во всех контроллерах и представлениях:

config('settings.facebook');

Шаг 1: Создайте поставщика услуг.

вы можете создать поставщика услуг с ремесленником:

php artisan make:provider SettingsServiceProvider

это создаст файл app/Providers/SettingsServiceProvider.php.

Шаг 2: Добавьте это в метод загрузки поставщика, который вы только что создали:

/**
 * Bootstrap the application services.
 *
 * @return void
 */
public function boot()
{
    // Laravel >= 5.2, use 'lists' instead of 'pluck' for Laravel <= 5.1
    config()->set('settings', \App\Setting::pluck('value', 'name')->all());
}

из документов Laravel:

[метод загрузки] вызывается после регистрации всех других поставщиков услуг, что означает, что у вас есть доступ ко всем другим услугам, которые были зарегистрированы рамки.

http://laravel.com/docs/5.1/providers#the-boot-method

Шаг 3: Регистрация поставщика в приложении.

добавьте эту строку в providers массив config/app.php:

App\Providers\SettingsServiceProvider::class,

и это все. Удачи в кодировании!

обновление: я хочу добавить, что метод загрузки поддерживает инъекцию зависимостей. Поэтому вместо жесткого кодирования \App\Setting, вы можете ввести репозиторий / интерфейс, связанный с репозиторием, который отлично подходит для тестирования.

обновление 2: As Джемусу упомянул в своем комментарии, приложение будет запрашивать базу данных по каждому запросу. Чтобы помешать этому, вы можете кэшировать настройки. Это можно сделать двумя способами.

  1. поместите данные в кэш каждый раз, когда администратор обновляет настройки.

  2. просто помню настройки в кэше в течение некоторого времени и очистить кэш каждый раз, когда администратор обновляет настройки.

чтобы сделать мысли более отказоустойчивыми, я бы использовал второй вариант. Кэши могут быть очищены непреднамеренно. Первый вариант завершится неудачей на новых установках, если администратор не установил параметры или переустановить после сбоя сервера.

для второго варианта измените метод загрузки поставщиков услуг:

/**
 * Bootstrap the application services.
 *
 * @param \Illuminate\Contracts\Cache\Factory $cache
 * @param \App\Setting                        $settings
 * 
 * @return void
 */
public function boot(Factory $cache, Setting $settings)
{
    $settings = $cache->remember('settings', 60, function() use ($settings)
    {
        // Laravel >= 5.2, use 'lists' instead of 'pluck' for Laravel <= 5.1
        return $settings->pluck('value', 'name')->all();
    });

    config()->set('settings', $settings);
}

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

/**
 * Updates the settings.
 *
 * @param int                                 $id
 * @param \Illuminate\Contracts\Cache\Factory $cache
 *
 * @return \Illuminate\Http\RedirectResponse
 */
public function update($id, Factory $cache)
{
    // ...

    // When the settings have been updated, clear the cache for the key 'settings':
    $cache->forget('settings');

    // E.g., redirect back to the settings index page with a success flash message
    return redirect()->route('admin.settings.index')
        ->with('updated', true);
}

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

    // Grab settings from database as a list
    $settings = \App\Setting::lists('value', 'name')->all();

    // Generate and save config file
    $filePath = config_path() . '/settings.php';
    $content = '<?php return ' . var_export($settings, true) . ';';
    File::put($filePath, $content);

выше будет создан файл конфигурации, совместимый с Laraval, который по существу просто возвращает массив значений key =>. Созданный файл будет выглядеть примерно так.

<?php 

return array(
    name => 'value',
    name => 'value',
);

любой файл php в /config каталог будет автоматически включен Laravel и переменными массива, доступными для вашего приложения через the config() помощник:

config('settings.variable_name');

вы можете хранить данные в базе данных так же, как вы обычно делаете это в Laravel. \App\Setting::create(), \App\Setting::new() и другими методами.

для использования значений в blade, Вы можете сделать {{\App\Setting::where('name','title')->pluck('value')}}

и, вы также можете использовать области для этого.

class Setting extends Model
{
    public function scopeFor($query, $settingName)
    {
        return $query->where('name', $settingName);
    }
}

тогда вы можете использовать \App\Setting::for('title')->pluck('value')