Модуль для хранения, вывода и редактирования настроек приложения Yii2 в базе данных.
Примечание: Развертывание модуля описано на базе yii2-advanced-start. Подключение модуля не ограничивается данным шаблоном, разница подключения описаная ниже, не существенная.
Выполнить в корне приложения
git clone https://github.com/Dominus77/yii2-config-db.git modules/config
Применить миграцию
php yii migrate/up -p=@modules/config/migrations
Подключаем компонент модуля в common части, что бы компонент был доступен во всём приложении
// common\config\main.php
$config = [
//...
'components' => [
'config' => [
'class' => 'modules\config\components\DConfig',
'duration' => 3600, // Время для кэширования
],
// Определяем место для кэша
'cache' => [
'class' => 'yii\caching\FileCache',
'cachePath' => '@frontend/runtime/cache',
],
//...
],
//...
];
Подключаем модуль в backend части для возможности изменять значения в админке
// backend\config\main.php
$config = [
'bootstrap' => [
//...
'modules\config\Bootstrap',
],
'modules' => [
'config' => [
'class' => 'modules\config\Module',
'params' => [
'accessRoles' => ['@'], // Уровень доступа к форме изменения параметров
],
],
//...
],
// Подключаем поведение для замены параметров конфигурации нашими параметрами
'as beforeConfig' => [
'class' => '\modules\config\components\behaviors\ConfigBehavior',
],
//...
];
Подключаем модуль в console части для консольных команд
// console\config\main.php
$config = [
'bootstrap' => [
//...
'modules\config\Bootstrap',
],
'modules' => [
'config' => [
'class' => 'modules\config\Module',
],
//...
],
//...
];
В frontend части подключаем только поведение для применения наших параметров
// frontend\config\main.php
$config = [
// Подключаем поведение для замены параметров конфигурации нашими параметрами
'as beforeConfig' => [
'class' => '\modules\config\components\behaviors\ConfigBehavior',
],
//...
];
Подключение закончено.
Далее следует задать параметры которые будем хранить и изменять.
Все параметры задаются в классе [[modules\config\params\Params]]. Данный класс наследуется от [[modules\config\params\ConfigParams]] который реализует интерфейс [[modules\config\components\interfaces\ConfigInterface]].
Пример класса Params
<?php
namespace backend\models;
use Yii;
use modules\config\params\ConfigParams;
class Params extends ConfigParams
{
/**
* @return array
*/
public static function findParams()
{
return [
[
'param' => 'SITE_NAME',
'label' => 'Site Name',
'value' => '',
'type' => self::FIELD_TYPE_STRING,
'default' => 'My Site',
],
[
'param' => 'SITE_TIME_ZONE',
'label' => 'Timezone',
'value' => '',
'type' => self::FIELD_TYPE_STRING,
'default' => 'Europe/Moscow',
],
[
'param' => 'SITE_LANGUAGE',
'label' => 'Language',
'value' => '',
'type' => self::FIELD_TYPE_STRING,
'default' => 'ru',
]
];
}
}
Что бы подключить данный класс, следует указать его в конфигурации при подключении модуля. Если не указывать свой класс, то параметры будут браться из класса модуля [[modules\config\params\Params]].
$config = [
//...
'modules' => [
'config' => [
'class' => 'modules\config\Module',
'params' => [
'paramsClass' => 'backend\models\Params'
],
],
//...
],
//...
];
После этого необходимо сохранить данные в базу данных с помощью консольноых команд:
php yii config/init/down
php yii config/init/up
или одной командой
php yii config/init/update
Подробнее о консольных командах написано ниже.
Присваиваем значение параметру:
\Yii::$app->config->set('SITE_NAME', 'Мой сайт');
Получаем значение параметра:
\Yii::$app->config->get('SITE_NAME');
Удаляем значение параметра:
\Yii::$app->config->delete('SITE_NAME');
В поведении [[\modules\config\components\behaviors\ConfigBehavior]] присваиваются наши значения тем что прописаны в конфигурации, поэтому если требуется изменить какое либо значение из конфигурации нашим, то необходимо так же прописать его и в поведении. В текущем исполнении заданы базовые параметры, такие как name, language, timeZone. Для добавления своих параметров можно создать своё поведение и подключить его вместо [[\modules\config\components\behaviors\ConfigBehavior]].
Для того что бы не писать всё время присваивание значений в поведении, можно поступить следующим образом, в класс Params, в котором мы задаём параметры, добавить метод getReplace()
<?php
namespace backend\models;
use Yii;
use modules\config\params\ConfigParams;
class Params extends ConfigParams
{
/**
* @return array
*/
public static function findParams()
{
return [
[
'param' => 'SITE_NAME',
'label' => 'Site Name',
'value' => '',
'type' => self::FIELD_TYPE_STRING,
'default' => 'My Site',
],
[
'param' => 'SITE_TIME_ZONE',
'label' => 'Timezone',
'value' => '',
'type' => self::FIELD_TYPE_STRING,
'default' => 'Europe/Moscow',
],
[
'param' => 'SITE_LANGUAGE',
'label' => 'Language',
'value' => '',
'type' => self::FIELD_TYPE_STRING,
'default' => 'ru',
],
[
'param' => 'ADMIN_EMAIL',
'label' => 'Email administrator',
'value' => '',
'type' => self::FIELD_TYPE_STRING,
'default' => 'admin@example.loc',
],
[
'param' => 'SUPPORT_EMAIL',
'label' => 'Email support',
'value' => '',
'type' => self::FIELD_TYPE_STRING,
'default' => 'support@example.loc',
],
];
}
/**
* Ассоциируем ключи конфига с нашими параметрами для замены
* @return array
*/
public static function getReplace()
{
return [
'name' => 'SITE_NAME',
'timeZone' => 'SITE_TIME_ZONE',
'language' => 'SITE_LANGUAGE',
'adminEmail' => 'ADMIN_EMAIL',
'supportEmail' => 'SUPPORT_EMAIL',
];
}
}
и модифицировать наше поведение следующим образом:
<?php
namespace common\components\behaviors;
use Yii;
use yii\base\Behavior;
use yii\base\Controller;
use yii\helpers\ArrayHelper;
use yii\web\Application;
use backend\models\Params;
/**
* Class ConfigBehavior
* @package common\components\behaviors
*/
class ConfigBehavior extends Behavior
{
/**
* @var \modules\config\params\Params
*/
public $paramsClass = '\modules\config\params\Params';
/**
* @inheritdoc
*/
public function events()
{
return [
Controller::EVENT_BEFORE_ACTION => 'beforeAction'
];
}
/**
* Set config
*/
public function beforeAction()
{
/** @var Application $app */
$app = $this->owner;
$this->setParams($app);
}
/**
* Set params
* @param Application $app
*/
private function setParams(Application $app)
{
$array = Yii::$app->config->getAll();
$replace = $this->paramsClass::getReplace();
foreach ($replace as $key => $value) {
if (isset($app->{$key})) {
if ($key == 'language' && YII_ENV_TEST) {
$app->{$key} = $app->language;
} else {
$app->{$key} = ArrayHelper::getValue($array, $value);
}
}
if (isset($app->params[$key])) {
$app->params[$key] = ArrayHelper::getValue($array, $value);
}
}
}
}
Теперь параметры и ассоциации можно определять только в одном классе Params, всё остальное автоматически выполнит наше поведение.
Примечание: Данное поведение было добавлено [[modules\config\components\behaviors\ConfigAdvancedBehavior]]
$config = [
// Подключаем поведение для замены параметров конфигурации нашими параметрами
'as beforeConfig' => [
'class' => '\modules\config\components\behaviors\ConfigAdvancedBehavior',
//'paramsClass' => '\backend\models\Params',
],
//...
];
Для заполнения базы данных параметрами определенными в классе Params
php yii config/init/up
Для удаления параметров
php yii config/init/down
Для обновления параметров
php yii config/init/update
В этой команде совмещены две предыдущие, down и up
Примечание: Для вступления в силу заданных параметров, данные команды следует запускать каждый раз когда изменяется класс Params.
<?= \yii\helpers\Url::to(['/config/default/update']) ?>
Для изменения вида формы редактирования идущей в комплекте с модулем, можно воспользоваться темизацией.
Настроим компонент view приложения для темизации
// backend\config\main.php
$current_theme = 'default'; // тема
$config = [
//...
'components' => [
'view' => [
'theme' => [
'basePath' => '@app/themes/' . $current_theme,
'baseUrl' => '@app/themes/' . $current_theme,
'pathMap' => [
'@app/views' => '@app/themes/' . $current_theme . '/views',
'@modules' => '@app/themes/' . $current_theme . '/modules',
],
],
],
//...
],
//...
];
В backend части создаём папки следующей структуры и два файла.
\backend
themes
default
modules
config
views
default
_form.php
update.php
Файлы можно скопировать из модуля и изменить по своему желанию.
После проделаных манипуляций, файлы вида модуля теперь будут браться из установленной нами темы, default.
При выполнении тестов приложения, выполните миграцию в тестовую базу
php yii_test migrate/up -p=@modules/config/migrations
Что бы включить модуль в процесс тестирования всего приложения, отредактируйте файл codeception.yml в корне приложения, добавив туда модуль.
# global codeception file to run tests from all apps
include:
- common
- frontend
- backend
- api
- modules/config
paths:
log: console/runtime/logs
settings:
colors: true
и выполните в корне приложения следующие консольные команды
для Windows:
vendor\bin\codecept build
vendor\bin\codecept run
для остальных систем:
vendor/bin/codecept build
vendor/bin/codecept run
The MIT License (MIT). Please see License File for more information.