Создание и редактирование файлов настроек в yii2

Для хранения переменных, которые меняются не очень часто, можно использовать хранение переменных в файлах (формат ключ-значение). Среди таких данных: email-ы, адреса, счетчики поисковых систем, числовые и строковые константы (описания). Среди достоинств такого подхода:

  • не генерируется дополнительный запрос в БД,
  • константы не "вшиваются" в код программы.

Сначала установим права на редактирование файла config/params.php:

sudo chown -R www-data:www-data config/params.php
sudo chmod -R 755 config/params.php

Также, следует занести params.php в .gitignore.

В бекенде создадим helper:

<?php

namespace app\backend\helpers;

use Yii;
use yii\helpers\VarDumper;

class ParamsHelper
{

    public static function getConfig()
    {
        $directory = Yii::getAlias('@app/config');
        $filename = $directory. '/params.php';

        $config = require($filename);
        return $config;
    }

    public static function setConfig($config)
    {
        $directory = Yii::getAlias('@app/config');
        $filename = $directory. '/params.php';

        file_put_contents($filename, "<?php\nreturn " . VarDumper::export($config) . ";\n", LOCK_EX);

        return true;
    }

}

Далее, создаем контроллер

<?php

namespace app\backend\controllers;

use app\backend\helpers\ParamsHelper;
use yii\base\DynamicModel;
use yii\web\Controller;

class StatisticController extends Controller
{
    public function actionIndex()
    {
        $model = ParamsHelper::getConfig();
        $labels = self::getLabels();

        return $this->render('index', [
            'model' => $model,
            'labels' => $labels
        ]);
    }

    public function actionUpdate()
    {
        $config = ConfigHelper::getConfig();

        $fields = self::fields($config);

        $model = new DynamicModel($fields);
        $model
            ->addRule($fields, 'required')
            ->addRule($fields, 'string',['max'=>500]);

        $labels = self::getLabels();

        foreach ($fields as $field) {
            $model->$field = $config[$field];
        }

        if ($model->load(\Yii::$app->request->post()) && $model->validate()) {
            if (ParamsHelper::setConfig($model->attributes)) {
                \Yii::$app->session->setFlash('success', 'Данные обновлены');

                sleep(4);
                return $this->redirect('index');
            }
        }

        return $this->render('update', [
            'model' => $model,
            'labels' => $labels
        ]);
    }

    protected function fields($config)
    {
        $result = [];

        foreach ($config as $itemKey => $item) {
            array_push($result, $itemKey);
        }
        return $result;
    }

    protected function getLabels()
    {
        return [
            'adminEmail' => 'Админ-email'
        ];
    }

}

Теперь, по маршруту /backend/statistic/index доступен список переменных (не забудьте создать файл index.php), по маршруту /backend/statistic/update доступно редактирование; примерное содержание файла update.php:

<div class="backend-params-update box box-primary">
    <?php $form = ActiveForm::begin(); ?>
    <div class="box-body table-responsive">
        <?php foreach ($model->attributes as $attributeKey => $attribute) : ?>
            <?= $form->field($model, $attributeKey)->textInput(['maxlength' => true])->label(isset($labels[$attributeKey]) ? $labels[$attributeKey] : $attributeKey) ?>
        <?php endforeach; ?>
    </div>
    <div class="box-footer">
        <?= Html::submitButton('Сохранить', ['class' => 'btn btn-success btn-flat']) ?>
    </div>
    <?php ActiveForm::end(); ?>
</div>

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

{{ message }}

{{ 'Comments are closed.' | trans }}