阿江 2017-10-12 10:55:54 2729次浏览 0条回复 0 0 0

说明

学习Yii Framework 2易2框架的过程是漫长的也是充满乐趣的以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现提供了较完整的代码供你参考不妥之处请多多指正

原文网址:

http://www.yiiframework.com/doc-2.0/guide-concept-components.html
http://www.yiiframework.com/doc-2.0/yii-base-component.html

本文主题:组件(Components)

组件(Component)是Yii应用中主要的构建模块,组件是yii\base\Component或其子类的实例。组件为其子类提供了三大主要特征: 属性(Property) 事件(Event) 行为(Behavior)

单独使用或组合使用这三个特征,使得Yii的类可以自定义并易于使用,例如:"date picker widget"是一个用户界面组件,在视图中使用它就可以创建一个互动的日期选择器(date picker):

use yii\jui\DatePicker;
echo DatePicker::widget([
    'language' => 'ru',
    'name'  => 'country',
    'clientOptions' => [
        'dateFormat' => 'yy-mm-dd',
    ],
]);

因为是扩展自yii\base\Component,所以这个小部件(widget)的属性可以非常容易修改。

对象类(Object)与组件类(Component)的比较:

组件(Component)缘于强大的功能,与常规对象相比,它是比较厚重的,因为组件要支持事件和行为的功能,它会占用更多的内存和CPU时间。如果你的组件无需这两个特征,你可以从yii\base\Object扩展,而不是yii\base\Component。这样,你的组件就可以和普通的PHP对象一样高效,但仅支持属性特征。 Object类也是Component类的父类,如果无需事件和行为,就可以直接从Object类继承,从而跳过Component类了。

无论你的类是继承自yii\base\Component还是yii\base\Object,我们都推荐你遵守以下约定: 1、如果你重写了构造器(constructor),请将constructor最后一个参数定义为$config ,并将这个参数传给父级构造器。 2、始终在重写的构造器尾部调用父级构造器。 3、如果你重写了yii\base\Object::init()方法,请一定在你的init()方法头部调用父级init()方法。

示例如下:
namespace yii\components\MyClass;
use yii\base\Object;
class MyClass extends Object{
	public $prop1;
	public $prop2;
	public function __construct($param1,$param2,$config=[]){
		//在配置应用之前完成初始化工作
		/*
		...代码...
		*/
		parent::__construct($config);
	}
	public function init(){
		parent::init();
		//配置应用完成后再进行初始化
		/*
		...代码...
		*/
	}
}

遵照这些约定将使用你创建的组件可以变动配置,例如:

	$component=new MyClass(1,2,['prop1'=>3,'prop2'=>4]);
	//或者:
	$componnet=\Yii\createObject([
		'class'	=>MyClass::className(),
		'prop1'=>3,
		'prop2'=>4,
	],[1,2]);

提示:调用Yii::createObject()看起来更复杂,但它更强大,因为它是通过顶层依赖注入容器来完成的。

yii\base\Object类执行的生命周期: 1、在构造器内预初始化(Pre-initialization),可以在这里设置默认的属性值。 2、通过$config 配置对象,可以在构造器内通过这个配置覆盖默认值。 3、在init()中进行初始化(Post-initialization),可以重写此方法,用以执行有效性检测和属性的标准化。 4、调用对象的方法。

前三步都发生在对象的构造器中,也就是说你一旦获取了一个类实例,对象已经是被初始化到一个可用的状态。

yii\base\Component的API

组件(Component)是实现property、event、behavior特征的基础类。 组件提供了事件(event)、行为(behavior)特征,属性(property)特征则是在父类Object中实现。 事件实现了在特定情况下依赖注入(inject)自定义代码到已有代码中的机制,例如:当用户添加了一条评论时,评论对象会触发"add"事件,我们可以编写自定义代码,并把它添加到这个事件中,这样当"add"事件被触发时,我们的自定义代码就会被执行。

一个事件在其定义的类中使用唯一的名称来标识自己,事件名称是大小写敏感的。(case-sensitive)

事件处理器(event hanlder)包含一个或多个PHP回调函数,它可以被添加到事件中。可以调用trigger()来添加事件。当一个事件被添加时,事件处理器会按照添加顺序被自动调用。

添加一个事件处理器到一个事件,使用on()函数: $post->on('update',function(){

//发送提醒邮件

}); 在上例代码中,为$post 的'update'事件添加了一个匿名函数。 我们可以添加如下类型的事件处理器: 1、匿名函数(anonymous function):function($event){...} 2、类方法(object method):[$object,'handledAdd'] 3、静态类方法(staic class method):['Page','handleAdd'] 4、全局函数(global funcion):'handleAdd'

事件处理器的定义如下:

function foo($event)

$event 是yii\base\Event对象,它包含了事件相关的所有参数信息。

我们也可以在配置组件时使用配置数组来添加一个事件处理器,格式如下:

[
	'on add'=>function($evnet){...}
]

'on add'表示添加一个事件处理器到'add'事件。

我们也可以为事件处理器添加一些数据:

$post->on('update',function($event){
	//数据可以通过$event->data来获取
},$data);

行为(behavior)是yii\base\Behavior的实例或子类,一个组件可以添加一个或多个行为,当一个行为被添加到组件时,它的公共属性和方法都可以被组件直接调用,就象是组件自己的属性和方法一样。

要添加一个行为到组件中,可以在behaviors()中声明这种对应关系,或者使用attatchBehavior()。在behaviors()中声明的行为将自动被添加到对应的组件中去。

当使用配置数组配置时可以添加一个行为到一个组件中去,代码如下:

[
	'as tree'=>[
		'class'=>'Tree',
	],
]

'as tree'代表添加一个名为'tree'的行为,其定义的数组将被传给Yii::createObject()去创建此行为的对象。

(全文完)

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