如何在 Yii 2 中使自定义设置数据在全球范围内可用?

2022-08-31 00:27:36

我正在创建一个应用程序,该应用程序将一些设置存储在数据库中,理想情况下,最好在引导期间加载这些设置,并通过全局对象使它们可用。

这可以以某种方式完成并添加到?Yii::$app->params

例如,您可以创建一个类并将详细信息作为数组或对象实例返回?


答案 1

好吧,我发现了如何做到这一点。

基本上,你必须实现bootstrapInterface,下面的例子是我的情况。

设置实现接口的类的路径:

app/config/web.php:

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => [
                    'log',
                    'app\base\Settings',
    ],
    //.............
];

所以我在位置放置了一个调用的类:.Settings.phpapp\base\Settings.php

那么这是我的文件:Settings.php

namespace app\base;

use Yii;
use yii\base\BootstrapInterface;

/*
/* The base class that you use to retrieve the settings from the database
*/

class settings implements BootstrapInterface {

    private $db;

    public function __construct() {
        $this->db = Yii::$app->db;
    }

    /**
    * Bootstrap method to be called during application bootstrap stage.
    * Loads all the settings into the Yii::$app->params array
    * @param Application $app the application currently running
    */

    public function bootstrap($app) {

        // Get settings from database
        $sql = $this->db->createCommand("SELECT setting_name,setting_value FROM settings");
        $settings = $sql->queryAll();

        // Now let's load the settings into the global params array

        foreach ($settings as $key => $val) {
            Yii::$app->params['settings'][$val['setting_name']] = $val['setting_value'];
        }

    }

}

我现在可以通过全局访问我的设置。Yii:$app->params['settings']

有关引导内容的其他方法的额外信息,请单击此处


答案 2

我参加派对有点晚了,但有一种更简单的方法可以做到这一点。

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => [
                    'log',
    ],
    //.............
    'params' = [
        'adminEmail' => 'admin@example.com',
        'defaultImage' => '/images/default.jpg',
        'noReplyEmail' => 'noreply@example.com'
    ],
];

现在,您可以使用以下语法简单地访问这些变量

$adminEmail = \Yii::$app->params['adminEmail'];

推荐