Как сделать данные пользовательских настроек доступными во всем мире в Yii 2?

Я создаю приложение, которое хранит некоторые настройки в базе данных, и в идеале было бы хорошо загрузить эти параметры во время начальной загрузки и сделать их доступными через объект по всему миру.

Можно ли это сделать и добавить к Yii::$app->params как-то?

Как вы можете создать класс и вернуть детали как массив или экземпляр объекта?

Ответы

Ответ 1

Хорошо, я узнал, как это сделать.

В основном вы должны реализовать bootstrapInterface, пример ниже для моей ситуации.

Задайте путь к вашему классу, который реализует интерфейс:

приложение /Config/web.php:

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

Итак, я поместил класс под названием Settings.php в папку: app\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 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

Другой способ сделать это - переопределить метод init() в baseController.

class BaseController extends Controller{...    
public function init()
    {    
            if(Yii::$app->cache->get('app_config'))
        {
            $config = Yii::$app->cache->get('app_config');
            foreach ($config as $key => $val)
            {
                Yii::$app->params['settings'][$key] = $val->value;
            }
        }
        else
        {
            $config = Config::find()->all();
            $config = ArrayHelper::regroup_table($config, 'name', true);
            Yii::$app->cache->set('app_config', $config, 600);

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

Это зависит от вас. Я использовал этот метод в Yii1, но теперь я бы предпочел использовать метод начальной загрузки

Ответ 3

Я немного опаздываю на вечеринку, но есть намного более простой способ сделать это.

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => [
                    'log',
    ],
    //.............
    'params' = [
        'adminEmail' => '[email protected]',
        'defaultImage' => '/images/default.jpg',
        'noReplyEmail' => '[email protected]'
    ],
];

Теперь вы можете просто получить доступ к этим переменным со следующим синтаксисом

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