我正试图将我的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') }}{!! Form::close() !!}Título do artigo{!! Form::text('title', null, ['placeholder' => 'Nome do site']) !!} @if($errors->has('title')){{ $errors->first('title') }}@endif
但事情不起作用.如何将值更新到表中?
请参阅更新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);
}