阿江 2017-10-12 16:00:22 173次浏览 0条回复 0 0 0

说明

学习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
*/

(全文完)

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册