[Yii2笔记]053配置(Configurations) [ 技术分享 ]
说明
学习Yii Framework 2(易2框架)的过程是漫长的,也是充满乐趣的,以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现,提供了较完整的代码,供你参考。不妥之处,请多多指正!
原文网址:
http://www.yiiframework.com/doc-2.0/guide-concept-configurations.html
本文主题:配置(Configurations)
在Yii中,配置被广泛应用于创建新对象或初始化已存在的对象,配置通常包括将要被创建的对象的类名称,要分配给对象属性的初始化数据列表。配置中可能还包含事件处理器列表,这样就可以绑定对象的事件,可能还包含行为列表,其中定义了要绑定到对象的行为。
在以下代码是创建和初始化数据库的一个配置:
$config=[
'class'=>'yii\db\Connection',
'dsn'=>'mysql:host=127.0.0.1;dbname=demo',
'username'=>'root',
'password'=>'',
'charset'=>'utf8',
];
$db=Yii::createObject($config);
Yii::createObject方法使用一个配置数组作为它的参数,并通过初始化配置中已指定名称的类来创建一个对象,当对象初始化时,配置的其他部分将被用于给对象的属性赋初值、绑定事件处理器、绑定行为。 对于一个已经存在的对象,我们可以使用Yii::configure()和配置数组来初始化对象属性。
Yii::configure($object,$config);
注意,这种情况下配置数组不能再含有class元素。
1、Configuration Format
配置格式 配置的格式通常是如下形式:
[
'class'=>'ClassName',
'propertyName'=>'propertyValue',
'on eventName'=>$eventHandler,
'as behaviorName'=>$behaviorConfig,
]
解释如下:
1、class元素(element)定义了一个要创建的类,使用的是类的全名称(fully qualified class name)。
2、propertyName元素为指定的类属性定义了初始值,键名是属性名称,键值是对应的初始化值,只有公共成员变量和使用getter/setter定义的属性可以进行配置。
3、on eventName元素定义了绑定到对象事件上的处理器,注意:此数组键名由事件on +事件名称组成。请参考事件章节以查看支持的事件处理器格式。
4、as behaviorName元素定义了将要绑定到对象上的行为,注意:该数组键名由as +行为名称组成,键值$behaviorConfig 是创建行为时的一配置数组,其格式与前面描述的配置数组相似。
以下代码示范了一个配置,它可以初始化属性值,绑定事件处理器,绑定行为:
[
'class'=>'app\components\SearchEngine',
'apiKey'=>'xxxxxx',
'on search'=>function(){
Yii::info("Keyword searched:".$event->keyword);
},
'as indexer'=>[
'class' =>'app\components\IndexerBehavior',
//...行为属性初始化参数...
],
]
2、Using Configurations(使用配置)
在Yii2中配置使用在很多地方,在本节的开头,我们展示了使用Yii::createObject()和配置数组去创建一个对象,在本小节,我们将介绍应用配置(application configuration)和小部件配置(widget configuration),这也是配置的两类主要用途。
应用配置(Application Configurations)
在Yii中,应用配置或许是最复杂的数组之一,这是因为应用类(application class)有许多可以配置的属性和事件,更重要的是,通过应用注册的组件在创建时,它的组件属性也可以接收一个配置数组。以下代码是一个基础模板的应用配置的摘要信息:
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'extensions' => require(__DIR__ . '/../vendor/yiisoft/extensions.php'),
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
],
'log' => [
'class' => 'yii\log\Dispatcher',
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
],
],
],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=stay2',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
],
];
这个配置没有键名为class的元素,因为它是在入口脚本中使用的,类名已经在入口脚本中给定了:
(new yii\web\Application(config))->run();
D:\phpwork\advanced\frontend\web\index.php
$application = new yii\web\Application($config);
$application->run();
更多关于应用组件属性的配置可以参考以下文档: Application,http://www.yiiframework.com/doc-2.0/guide-structure-applications.html Service Locator,http://www.yiiframework.com/doc-2.0/guide-concept-service-locator.html
小部件配置(Widget Configurations)
当使用小部件时,你可能需要针对小部队属性的自定义配置,yii\base\Widget::widget()和yii\base\Widget::begin()两个方法都可以用于创建一个小部件,它们都使用一个配置数组,代码如下:
use yii\widgets\Menu;
echo Menu::widget([
'activateItems' => false,
'items' => [
['label' => 'Home', 'url' => ['site/index']],
['label' => 'Products', 'url' => ['product/index']],
['label' => 'Login', 'url' => ['site/login'], 'visible' => Yii::$app->user->isGuest],
],
]);
上述代码创建一个菜单部件,并初始化它的activeItems属性为false,itmes属性配置了要显示的菜单项。 注意:因为类名已经给出,所以配置数组中没有class项。
3、Configuration Files(配置文件)
当配置非常复杂时,通用的做法是将这个配置保存到一个或多个PHP文件中去,也就是常说的配置文件(configuration file),一个配置文件返回一个PHP数组,用此数组代表配置,例如,你可以保存应用配置到一个文件web.php,代码如下:
return [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'extensions' => require(__DIR__ . '/../vendor/yiisoft/extensions.php'),
'components' => require(__DIR__ . '/components.php'),
];
因为components配置过于复杂,所以我们把它存储为一个独立文件,取名为components.php,并使用require将它包含到web.php,components.php的文件内容如下:
return [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
],
'log' => [
'class' => 'yii\log\Dispatcher',
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
],
],
],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=stay2',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
];
获取一个存储在文件中的配置,只需要简单的"require"即可,代码如下:
$config=require('path/to/web.php');
(new yii\web\Application($config))->run();
4、Default Configurations(默认配置)
Yii::createObject()方法的实现是基于依赖注入容器(dependency injection container),它允许你定义一系列所谓的默认配置,当使用Yii::createObject()创建类实例时,这些配置会被所有实例所应用。在启动代码(bootstrapping code)中可以使用Yii::$container->set()方法来设置默认配置。 例如,如果你想自定义yii\widgets\LinkPager,让所有的连接页只显示最多5页的按钮(默认值是10),你可以使用以下代码实现:
\Yii::$container->set('yii\widgets\LinkPager',[
'maxButtonCount'=>5,
]);
如果不使用默认配置,在每处使用LinkPager的地方都需要你去配置maxButtonCount。
5、Environment Constants(环境常量)
根据应用运行环境的不同,配置往往也是不同的,例如,在开发环境,你可能会使用一个名为mydb_dev的数据库,当在生产服务器上时,你可能会使用mydb_prod数据库,为了更方便的切换环境,Yii提供了一个名为YII_ENV的常量,这个常量 可以在应用的入口脚本中定义,例如:
defined('YII_ENV') or define('YII_ENV','dev');
你可以定义YII_ENV为下列值之一: prod:生产环境(production environment),常量YII_ENV_PROD会被设为true,这也是YII_ENV的默认值。 dev:开发环境(development environment),常量YII_ENV_DEV会被设为true。 test:测试环境(testing environment),常量YII_ENV_TEST会被设为true。
通过这些环境常量,我们就可以在不同环境下定义不同的配置了,例如,当在开发环境下,应用配置应包含以下代码以使得调试工具条和调试器有效:
$config = [...];
if (YII_ENV_DEV) {
//为开发环境进行配置调整
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = 'yii\debug\Module';
}
return $config;
//-----------------------------------------------
实例:配置的应用实例
//--------------- //实例:修改默认配置: D:\phpwork\advanced\frontend\web\index.php
<?php
defined('YII_DEBUG') or define('YII_DEBUG',true);//true,false
defined('YII_ENV') or define('YII_ENV', 'dev');//dev,prod,test
require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../../common/config/bootstrap.php');
require(__DIR__ . '/../config/bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);
//在配置参数初始化完成之后(才能使用\Yii),创建应用实例之前(要修改默认配置,而不是修改Yii2的核心代码)
\Yii::$container->set('yii\widgets\LinkPager',[
'maxButtonCount'=>5,
]);
(new yii\web\Application($config))->run();
测试结果:
http://localhost:8082/country
/*
显示出来的分页按钮由10个变成了5个
*/
//--------------- //在widget中使用配置数组 D:\phpwork\advanced\frontend\controllers\PostController.php
public function actionConfigWidget(){
return $this->render('configWidget');
}
D:\phpwork\advanced\frontend\views\post\configWidget.php
<?php
use yii\widgets\Menu;
echo Menu::widget([
'activateItems'=>false,
'items'=>[
['label'=>'Home','url'=>'/'],
['label'=>'Contact','url'=>'/post'],
['label'=>'Introduction','url'=>'/site/login'],
],
]);
测试结果:
http://localhost:8082/post/config-widget
/*
Home
Contact
Introduction
*/
//--------------- //使用createObject()和配置数组创建对象 D:\phpwork\advanced\frontend\controllers\PostController.php
public function actionConfig(){
//定义配置数组
$config=[
'class'=>ConfigModel::className(),
'prop1'=>'value1',
];
//使用配置数组创建对象
$model=Yii::createObject($config);
echo '<br>prop1:'.$model->prop1;
$config=[
'prop1'=>'value2',
];
//使用配置数组修改对象属性
$model=Yii::configure($model,$config);
echo '<br>prop1:'.$model->prop1;
}
D:\phpwork\advanced\frontend\models\ConfigModel.php
<?php
namespace frontend\models;
use yii\base\Component;
class ConfigModel extends Component{
public $prop1;
public function foo(){
echo "This is ConfigModel.foo()";
}
}
测试结果:
http://localhost:8082/post/config
/*
prop1:value1
prop1:value2
*/
(全文完)
共 0 条回复
阿江
最后登录:2024-03-03
在线时长:186小时21分
- 粉丝94
- 金钱16816
- 威望160
- 积分20276