阿江 2017-10-12 16:00:22 2331次浏览 0条回复 2 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定义的属性可以进行配置。
3on 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
*/

(全文完)

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