Редактируемые параметры yii2-приложения в админке, которые легко получить в любом месте приложения, например, название или краткое описание (привет, вордпресс 😁) нашего сайта в views layouts:
<?= Yii::$app->config->siteName ?>
MySQL Schema
CREATE TABLE IF NOT EXISTS `config` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `val` varchar(255) DEFAULT NULL, `label` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
В большинстве случаев я использую yii2-app-basic, поэтому пример для этого шаблона.
Генерируем модель в Gii.
Привожу attributeLabels, ну и заодно пояснения:
public function attributeLabels()
{
return [
'id' => 'ID',
'name' => 'Параметр', // Уникальное имя параметра для кодера
'val' => 'Значение', // Размер значения можно увеличить
'label' => 'Название' // Человекопонятное названия для админа/контент-менеджера
];
}
Возможно, это странно, но пока не приходилось использовать слишком объемные «параметры» и было достаточно всего лишь VARCHAR(255) для значений (val), можете смело использовать TEXT, в WP, откуда частично позаимствована идея такого конфига, используется LONGTEXT (OMG!) в ущерб большей универсальности, чем производительности (у нас упор на максимум её). Я не рекомендую хранить слишком большой конфиг таким способом!
CRUD’им получившуюся модель Config в том же Gii по своему вкусу.
Создаем такой простой компонент components/Config.php:
<?php
namespace app\components;
use Yii;
use yii\base\Component;
use yii\base\InvalidConfigException;
use yii\helpers\ArrayHelper;
class Config extends Component {
private $_attributes;
/**
* @inheritdoc
*/
public function init() {
parent::init();
$this->_attributes = ArrayHelper::map(\app\models\Config::find()->all(), 'name', 'val');
}
public function __get($name) {
if (array_key_exists($name, $this->_attributes))
return $this->_attributes[$name];
return parent::__get($name);
}
}
Далее правим конфиг yii-2 приложения (config/web.php), добавляем наш компонент:
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log', 'config'], // добавляем наш компонент в автозагрузку
'components' => [
...
'config' => [ // сам компонент прописываем
'class' => 'app\components\Config',
],
],
Готово!
Небольшой совет (как в том же самом wp_options), если вы все-таки решились хранить очень объемные параметры/данные таким образом, то можно добавить в БД/модель BOOL флаг autoload и подгружать только реально используемые при каждом запросе параметры в components/Config.php.
$this->_attributes = ArrayHelper::map(\app\models\Config::find(['autoload' => true])->all(), 'name', 'val');