Laravel全局设置模型

时间:2015-09-23 16:46:55

标签: php mysql laravel model

我正在Laravel 5中构建一个小型CRUD应用程序。我有一些应用程序范围的设置,例如" SiteTitle"和" BaseURL"我想让我的管理员能够从UI进行更改。我的整个应用程序使用base.blade.php模板,该模板扩展到不同的视图+控制器,这是最有可能使用这些设置的地方。

类似的东西:

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

我将设置存储在数据库表中,并与Setting.php模型绑定。

我不是不是每个控制器方法都会在数据库中查询这些设置,只是将它们传递给模板base.blade.php。

创建某种类型的全局设置变量的最佳方法是什么?我可以在整个应用中重复使用?

提前致谢!

2 个答案:

答案 0 :(得分:13)

您可以创建一个服务提供程序,例如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::pluck('value', 'key')->toArray();
            });
        });
    }
}

假设您的设置模型根据Laravel的命名约定被称为Setting。然后,您可以访问如下设置:

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

如果您想要更漂亮的方式来访问设置,可以创建辅助函数:

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

哪个会像这样使用:

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

几乎模仿config()辅助函数的用法。

答案 1 :(得分:1)

如果您的应用使用多个控制器,那么您可以定义一个由所有其他控制器扩展的父控制器。在父控制器的构造函数中,您可以检索设置数据并将其存储在可用于所有子控制器类的类属性中。您的子控制器只需将此数据传递给视图即可。