【问题标题】:Laravel Global Settings ModelLaravel 全局设置模型
【发布时间】:2015-12-21 02:20:38
【问题描述】:

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

类似:

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

我将设置存储在与 Setting.php 模型相关联的数据库表中。

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

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

提前致谢!

【问题讨论】:

标签: php mysql laravel model


【解决方案1】:

您可以创建一个服务提供者,例如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() 辅助函数的用法。

【讨论】:

  • 非常优雅的解决方案,谢谢!请记住,如果您从空值开始,设置为 60 分钟的缓存将保持为空,即使您的数据库具有较新的值。刷新缓存使用Cache::forget('site.settings'); in artisan tinker.
  • @raphael 您可以在Setting 模型中添加一个观察者,在保存时刷新缓存。
  • 在 laravel 5.3 lists() 方法被折旧。所以,请使用pluck() 而不是列表。
  • 别忘了在config/app.php中加载你的服务提供者App\Providers\SettingServiceProvider::class,
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-12-06
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多