阿江 2017-10-12 10:55:54 92次浏览 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()去创建此行为的对象。

(全文完)

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