Laravel全局设置模型

Moo*_*ose 6 php mysql model laravel

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

就像是:

<h1><a href="#">{{ $setting->SiteName }}</a></h1>
Run Code Online (Sandbox Code Playgroud)

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

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

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

提前致谢!

Mar*_*ean 14

例如,您可以创建一个服务提供程序,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();
            });
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

假设您的设置模型是Setting根据Laravel的命名约定调用的.然后,您可以访问以下设置:

<h1>{{ array_get(app('settings'), 'site.name') }}</h1>
Run Code Online (Sandbox Code Playgroud)

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

function setting($key)
{
    return array_get(app('settings'), $key);
}
Run Code Online (Sandbox Code Playgroud)

哪个会像这样使用:

<h1>{{ setting('site.name') }}</h1>
Run Code Online (Sandbox Code Playgroud)

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

  • 非常优雅的解决方案,谢谢!请记住,如果您从一个空值开始,设置为 60 分钟的缓存将使其保持为空,即使您的数据库具有更新的值。要刷新缓存使用 `Cache::forget('site.settings'); 在工匠修补匠中。` (3认同)

小智 1

如果您的应用程序使用多个控制器,那么您可以定义一个由所有其他控制器扩展的父控制器。在父控制器的构造函数中,您可以检索设置数据并将其存储在类属性中,该属性可供所有子控制器类使用。您的子控制器可以简单地将这些数据传递给视图。