yii1tech / config
提供对Yii 1应用程序运行时配置的支持
Requires
- php: >=7.1
- yiisoft/yii: ~1.1.0
Requires (Dev)
- phpunit/phpunit: ^6.0 || ^7.0 || ^8.0 || ^9.3 || ^10.0.7
This package is auto-updated.
Last update: 2024-09-13 10:35:47 UTC
README
Yii 1应用程序运行时配置扩展
此扩展为Yii 1引入了持久的配置存储库。其特定用法提供了对应用程序运行时配置的支持,可以从数据库加载配置。
有关许可证信息,请参阅LICENSE文件。
安装
安装此扩展的首选方式是通过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
确定。
以下存储可供使用
- \yii1tech\config\StoragePhp - 将配置保存在PHP文件中
- \yii1tech\config\StorageDb - 将配置保存在关系型数据库中
- \yii1tech\config\StorageActiveRecord - 使用ActiveRecord查找配置
- \yii1tech\config\StorageArray - 使用内部数组进行配置存储,在单元测试中可能很有用
请参阅特定存储类以获取更多详细信息。
创建配置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?']); ?> <?= CHtml::submitButton('Save', ['class' => 'btn btn-primary']) ?> </div> <?php $this->endWidget(); ?>