yii1tech/config

提供对Yii 1应用程序运行时配置的支持

1.0.1 2023-05-30 13:37 UTC

This package is auto-updated.

Last update: 2024-09-13 10:35:47 UTC


README

Yii 1应用程序运行时配置扩展


此扩展为Yii 1引入了持久的配置存储库。其特定用法提供了对应用程序运行时配置的支持,可以从数据库加载配置。

有关许可证信息,请参阅LICENSE文件。

Latest Stable Version Total Downloads Build Status

安装

安装此扩展的首选方式是通过composer

运行以下命令

php composer.phar require --prefer-dist yii1tech/config

或将以下内容添加到您的composer.json的"require"部分。

"yii1tech/config": "*"

用法

此扩展允许使用从外部存储(如关系数据库)提取的配置重新配置已创建的Yii应用程序实例。它可以重新配置任何应用程序属性、组件或模块。配置是通过添加到应用程序配置的\yii1tech\config\Manager组件来执行的。例如

[
    'behaviors' => [
        'configFromManagerBehavior' => [
            'class' => yii1tech\config\ConfiguresAppFromConfigManager::class,
        ],
        // ...
    ],
    'components' => [
        'configManager' => [
            'class' => yii1tech\config\Manager::class,
            'items' => [
                'appName' => [
                    'path' => 'name',
                    'label' => 'Application Name',
                    'rules' => [
                        ['required'],
                    ],
                ],
                'dateFormat' => [
                    'path' => 'components.format.dateFormat',
                    'label' => 'HTML representing not set value',
                    'rules' => [
                        ['required'],
                    ],
                ],
            ],
        ],
        ...
    ],
];

为了应用通过\yii1tech\config\Manager定义的配置,使用yii1tech\config\ConfiguresAppFromConfigManager应用程序行为。它在请求处理开始之前自动更新应用程序配置。您可以使用以下代码手动将配置应用到应用程序或任何\CModule后代

$configManager = Yii::app()->get('configManager');
$configManager->configure(Yii::app());

注意!行为yii1tech\config\ConfiguresAppFromConfigManager会自动抑制在值恢复期间出现的任何错误或异常。这是为了避免在存储尚未准备好使用时(例如:数据库表尚未存在)阻止应用程序。存储失败错误只会出现在应用程序日志中。您应该手动测试值恢复是否在您的应用程序中工作,以避免意外行为。

配置项规范

应重新配置的应用程序部分由\yii1tech\config\Manager::$items确定,它是一个\yii1tech\config\Item的列表。每个配置项确定配置路径 - 应用程序配置数组中的键列表,它指向目标值。例如:路径'components.format.dateFormat'(或['components', 'format', 'dateFormat'])指向\CFormatter组件的'dateFormat'属性,路径'名称'指向\CApplication::$name等等。

注意:如果没有指定路径,它将被视为\CModule::$params数组中的键,该键与配置项ID(\yii1tech\config\Manager::$items数组中键的名称)相匹配。

配置项还可以具有多个属性,这些属性支持创建配置设置的Web界面。这些是

  • 'path' - array|string,应用程序组件配置路径。
  • 'label' - string,输入标签。
  • 'description' - string,配置参数描述或输入提示。
  • 'rules' - array,值验证规则。
  • 'cast' - string,要转换到的原生类型。
  • 'options' - array,对此项的附加描述性选项。

提示:由于运行时配置可能包含许多项目,并且它们的声明可能需要大量代码,因此可以将它们移动到单独的文件中,并通过该文件名指定。

以下是一些项目规范示例

<?php

return [
    'appName' => [
        'path' => 'name',
        'label' => 'Application Name',
        'rules' => [
            ['required'],
            ['length', 'min' => 1],
        ],
    ],
    'nullDisplay' => [
        'path' => 'components.format.dateFormat',
        'label' => 'Date representation format',
        'rules' => [
            ['required'],
            ['length', 'min' => 1],
        ],
    ],
    'adminEmail' => [
        'label' => 'Admin email address',
        'rules' => [
            ['required'],
            ['email'],
        ],
    ],
    'adminTheme' => [
        'label' => 'Admin interface theme',
        'path' => ['modules', 'admin', 'theme'],
        'rules' => [
            ['required'],
            ['in', 'range' => ['classic', 'bootstrap']],
        ],
        'options' => [
            'type' => 'dropDown',
            'items' => [
                'classic' => 'Classic',
                'bootstrap' => 'Twitter Bootstrap',
            ],
        ],
    ],
];

提示:无需为存储中的特定项目准备数据。如果缺失,则将从当前相关应用配置中选取值。因此,您可以在不涉及额外操作(如数据库迁移)的情况下自由添加和删除配置项。

配置存储

声明的配置项可能被保存到持久存储中,然后从中检索。实际的项目存储通过 \yii1tech\config\Manager::$storage 确定。

以下存储可供使用

请参阅特定存储类以获取更多详细信息。

创建配置Web界面

此扩展最常见的用例是创建一个Web界面,允许在运行时控制应用配置。\yii1tech\config\Manager不仅用于应用配置,还有助于创建配置编辑的界面。

配置管理的Web控制器可能如下所示

<?php

namespace app\controllers;

use CController;
use CHtml;
use Yii;

class ConfigController extends CController
{
    /**
     * Performs batch updated of application configuration records.
     */
    public function actionIndex()
    {
        /* @var $configManager \yii1tech\config\Manager */
        $configManager = Yii::app()->get('configManager');
        
        $configManager->restore();

        $models = $configManager->getItems();

        if (!empty($_POST)) {
            $valid = true;
            foreach ($models as $model) {
                $modelName = CHtml::modelName($model);
                if (isset($_POST[$modelName][$model->id])) {
                    $model->setAttributes($_POST[$modelName][$model->id]);
                }
                $valid = $valid && $model->validate();
            }
            
            if ($valid) {
                $configManager->save();

                Yii::app()->getComponent('user')->setFlash('success', 'Configuration saved.');
                
                $controller->refresh();
                
                return;
            }
        }

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

    /**
     * Restores default values for the application configuration.
     */
    public function actionDefault()
    {
        /* @var $configManager \yii1tech\config\Manager */
        $configManager = Yii::$app->get('configManager');
        $configManager->reset();
        
        Yii::app()->getComponent('user')->setFlash('success', 'Default configuration restored.');
        
        $this->redirect(['index']);
        
        return;
    }
}

主视图文件可以是以下内容

<?php
/** @var $this CController */ 
/** @var $form CActiveForm */ 
?>
<?php $form = $this->beginWidget(CActiveForm::class); ?>
    <?php foreach ($models as $model):?>
        <?php echo $form->labelEx($model, 'value'); ?>
        <div class="row">
            <?php echo $form->textField($model, '[' . $model->id . ']value'); ?>
        </div>
        <?php echo $form->error($model, 'value'); ?>
    <?php endforeach;?>
    
    <div class="form-group">
        <?= CHtml::link('Restore defaults', ['default'], ['class' => 'btn btn-danger', 'data-confirm' => 'Are you sure you want to restore default values?']); ?>
        &nbsp;
        <?= CHtml::submitButton('Save', ['class' => 'btn btn-primary']) ?>
    </div>

<?php $this->endWidget(); ?>