当前位置:  开发笔记 > 编程语言 > 正文

Laravel - 从设置表中设置全局变量

如何解决《Laravel-从设置表中设置全局变量》经验,为你挑选了1个好方法。

我正试图将我的settings表中的所有设置存储到一个全局变量中,但我现在陷入困境(我不知道下一步是什么),这是我的实际模型和播种机:

model - 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){
            \App\Setting::create($setting);
        }
    }
}

如何将所有数据存储在设置表中,然后从刀片或任何控制器或视图中进行访问?

编辑


现在,我的问题是,如何从表单更新单个或多个值?

我已经设置了这个:

我的路线:

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

我的Admin\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') }}
Título do artigo
{!! Form::text('title', null, ['placeholder' => 'Nome do site']) !!} @if($errors->has('title'))
{{ $errors->first('title') }}
@endif
{!! Form::close() !!}

但事情不起作用.如何将值更新到表中?



1> tommy..:

请参阅更新2中的改进答案

我会为此添加一个专用的服务提供商.它将读取存储在数据库中的所有设置,并将它们添加到Laravels配置中.这样,设置只有一个数据库请求,您可以访问所有控制器和视图中的配置,如下所示:

config('settings.facebook');

第1步:创建服务提供商.

您可以使用工匠创建服务提供商:

php artisan make:provider SettingsServiceProvider

这将创建文件app/Providers/SettingsServiceProvider.php.

第2步:将其添加到刚刚创建的提供程序的boot-method中:

/**
 * 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 Docs:

[引导方法]在所有其他服务提供者注册后调用,这意味着您可以访问框架注册的所有其他服务.

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

第3步:在您的应用程序中注册提供程序.

将此行添加到providers数组中config/app.php:

App\Providers\SettingsServiceProvider::class,

就是这样.快乐的编码!

更新:我想补充一点,boot-method支持依赖注入.因此\App\Setting,您可以注入存储库/绑定到存储库的接口,而不是硬编码,这非常适合测试.

更新2:正如Jeemusu在评论中提到的,该应用程序将在每次请求时查询数据库.为了阻止这种情况,您可以缓存设置.基本上有两种方法可以做到这一点.

    每次管理员更新设置时,都会将数据放入缓存中.

    只需记住缓存中的设置一段时间,并在每次管理员更新设置时清除缓存.

为了使思考更容错,我会使用第二个选项.缓存可以无意中清除.只要管理员未设置设置或在服务器崩溃后重新安装,第一个选项将在全新安装时失败.

对于第二个选项,请更改Service Providers引导方法:

/**
 * 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);
}

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有