Настройки проекта Yii2 в базе данных

Перенос всех настроек проекта на yii2 в таблицу базы данных

Во-первых можно отказаться от хранения настроек в файле params.php.

Во-вторых изменение настроек становится доступным из web-интерфейса проекта на Yii2.

Начнем с миграции

Создаем первую миграцию

./yii migrate/create create_table_config

Файл миграции:

<?php
use yii\db\Migration;
class m180121_073930_create_table_config extends Migration {

    public function safeUp() {
        $this->createTable('{{%config}}', [
            'id' => $this->primaryKey()->comment('ID'),
            'param' => $this->string(128)->notNull()->comment('PARAM'),
            'value' => $this->text()->notNull()->comment('VALUE'),
            'default' => $this->text()->notNull()->comment('DAFAULT'),
            'label' => $this->string()->notNull()->comment('LABEL'),
            'type' => $this->string(128)->notNull()->comment('TYPE'),
        ]);
        $this->createIndex('param', '{{%config}}', 'param', true);
    }

    public function safeDown() {
        $this->dropTable('{{%config}}');
    }
}

Вторая миграция

./yii migrate/create insert_data_to_table_config

Содержимое файла миграции зависит от того, что мы будем хранить в конфигурации

<?php
use yii\db\Migration;
class m180121_174505_insert_data_to_table_config extends Migration {

    public function safeUp() {
        $this->truncateTable('{{%config}}');
        $this->insert('{{%config}}', ['param' => 'site.name', 'value' => '',
            'default' => 'SiteName',
                             'label' => 'Название сайта', 'type' => 'string']);
        $this->insert('{{%config}}', ['param' => 'site.phone', 'value' => '',
            'default' => '8 800 900 50 30',
                             'label' => 'Телефон на сайте', 'type' => 'string']);
        $this->insert('{{%config}}', ['param' => 'company.country', 'value' => '',
            'default' => 'Россия',
                             'label' => 'Страна', 'type' => 'string']);
    }

    public function safeDown() {
        $this->truncateTable('{{%config}}');
    }
}

Создаем модель Config.php

<?php

namespace app\models;

use Yii;

class Config extends \yii\db\ActiveRecord
{

    public static function tableName()
    {
        return '{{%config}}';
    }

    public function rules()
    {
        return [
            [['param', 'default', 'label', 'type'], 'required'],
            [['value', 'default'], 'string'],
            [['param', 'type'], 'string', 'max' => 128],
            [['label'], 'string', 'max' => 255],
            [['param'], 'unique'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'id' => Yii::t('admin', 'ID'),
            'param' => Yii::t('admin', 'PARAM'),
            'value' => Yii::t('admin', 'VALUE'),
            'default' => Yii::t('admin', 'DAFAULT'),
            'label' => Yii::t('admin', 'LABEL'),
            'type' => Yii::t('admin', 'TYPE'),
        ];
    }
}

Создаем новый компонент ConfigComponent.php

<?php
namespace app\components;

use yii\base\Component;
use app\models\Config;

class ConfigComponent extends Component {

    protected $data = array();

    public function init() {
        parent::init();
        $items = Config::find()->all();
        foreach ($items as $item) {
            if ($item->param) {
                $this->data[$item->param] = $item->value === '' ?
                                         $item->default : $item->value;
            }
        }
    }

    public function get($key) {
        if (array_key_exists($key, $this->data)) {
            return $this->data[$key];
        } else {
            throw new Exception('Undefined parameter ' . $key);
        }
    }

    public function set($key, $value) {
        $model = Config::model()->findByAttributes(array('param' => $key));
        if (!$model) {
            throw new Exception('Undefined parameter ' . $key);
        }

        $this->data[$key] = $value;
        $model->value = $value;
        $model->save();
    }
}

Затем подключаем этот компонент в файле config/web.php и не забываем там же включить его в bootstrap.

$config = [
// ...
    'bootstrap' => [
        // ... 
        'config',
        // ...
    ],
    'components' => [
                    // . . .
        'config' => [
            'class' => 'app\components\ConfigComponent',
        ],
                    // ...
          ]

Кажется все.

Осталось только написать функционал изменения параметров.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *