6:扩展Yii(Yii权威指南)

本文介绍了Yii框架中的扩展使用方法,包括Zii扩展库的应用、组件、行为、控制器、动作、过滤器、检验器及控制台命令等不同类型的扩展配置与使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适用扩展通常包含了以下三步:

  1. 从 Yii 的 扩展库 下载扩展.
  2. 解压到 应用程序的基目录 的子目录 extensions/xyz 下,这里的 xyz 是扩展的名称.
  3. 导入, 配置和使用扩展.
每个扩展都有一个所有扩展中唯一的名称标识.把一个扩展命名为  xyz ,我们也可以使用路径别名定位到包含了 xyz 所有文件的基目录.


Zii Extensions
在我们介绍第三方扩展到用法前,我们应该知道Zii扩展库。它是Yii团队开发的一个扩展并默认从1.1.0版本开始包含。Zii库现在作为Google Project托管着。
在使用Zii扩展到时候,我们必须要参阅相关类了解路径别名的使用方法zii.path.to.ClassName。在这里Yii定义zii是一个Zii库的根目录。例如,如果我们使用   CGridView,我们必须使用如下代码在试图中使用这个扩展:
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
));


应用的部件

使用 应用的部件, 首先我们需要添加一个新条目到 应用配置 的 components 属性, 如下所示:

return array(
    // 'preload'=>array('xyz',...),
    'components'=>array(
        'xyz'=>array(
            'class'=>'application.extensions.xyz.XyzClass',
            'property1'=>'value1',
            'property2'=>'value2',
        ),
        // 其他部件配置
    ),
);

然后,我们可以在任何地方通过使用  Yii::app()->xyz 来访问部件.部件将会被  惰性创建(就是,仅当它第一次被访问时创建.) , 除非我们把它配置到  preload 属性里.


行为(Behavior)
Behavior可以用在各种组件中,使用这个组件有2个步骤:1 一个hehavior要附在一个目标组件上;2 调用一个Behavior是通过它的目标组件。例如:
// $name uniquely identifies the behavior in the component
$component->attachBehavior($name,$behavior);
// test() is a method of $behavior
$component->test();

更多的时候,调用一个Behavior是通过配置而不是通过attachBehavior方法。例如:在一个应用组件上attach一个Behavior,我们可以这么配置:
return array(
    'components'=>array(
        'db'=>array(
            'class'=>'CDbConnection',
            'behaviors'=>array(
                'xyz'=>array(
                    'class'=>'ext.xyz.XyzBehavior',
                    'property1'=>'value1',
                    'property2'=>'value2',
                ),
            ),
        ),
        //....
    ),
);
上面的配置attach xyz Behavior到db应用组件。我们可以这样做是因为 CApplicationComponent定义了一个属性behaviors。所以我们可以设置这个属性,在加载的时候,这个组件attach相应的Behavior。
For  CController CFormModel  and  CActiveRecord  classes which usually need to be extended, attaching behaviors can be done by overriding their  behaviors()  method. The classes will automatically attach any behaviors declared in this method during initialization. For example,
public function behaviors(){
    return array(
        'xyz'=>array(
            'class'=>'ext.xyz.XyzBehavior',
            'property1'=>'value1',
            'property2'=>'value2',
        ),
    );
}


组件(Components)
组件  主要用在  视图  里.假设组件类  XyzClass  属于  xyz  扩展,我们可以如下在视图中使用它:
// 组件不需要主体内容
<?php $this->widget('application.extensions.xyz.XyzClass', array(
    'property1'=>'value1',
    'property2'=>'value2')); ?>
 
// 组件可以包含主体内容
<?php $this->beginWidget('application.extensions.xyz.XyzClass', array(
    'property1'=>'value1',
    'property2'=>'value2')); ?>
 
...组件的主体内容...
 
<?php $this->endWidget(); ?>


动作(Action)

动作 被 控制器 用于响应指定的用户请求.假设动作的类 XyzClass 属于 xyz 扩展,我们可以在我们的控制器类里重写 CController::actions 方法来使用它:

class TestController extends CController{
    public function actions()
    {
        return array(
            'xyz'=>array(
                'class'=>'application.extensions.xyz.XyzClass',
                'property1'=>'value1',
                'property2'=>'value2',
            ),
            // 其他动作
        );
    }}

然后,我们可以通过 路由 test/xyz 来访问.



过滤器(Filter)

过滤器 也被 控制器 使用.过滤器主要用于当其被 动作 挂起时预处理,提交处理用户请求.假设过滤器的类XyzClass 属于 xyz 扩展,我们可以在我们的控制器类里重写 CController::filters 方法来使用它:

class TestController extends CController{
    public function filters()
    {
        return array(
            array(
                'application.extensions.xyz.XyzClass',
                'property1'=>'value1',
                'property2'=>'value2',
            ),
            // 其他过滤器
        );
    }}

在上述代码中,我们可以在数组的第一个元素里使用加号或者减号操作符来限定过滤器只在那些动作中生效.更多信息,请参照文档的 CController.


控制器

控制器 提供了一套可以被用户请求的动作.我们需要在 应用配置 里设置 CWebApplication::controllerMap 属性,才能在控制器里使用扩展:

return array(
    'controllerMap'=>array(
        'xyz'=>array(
            'class'=>'application.extensions.xyz.XyzClass',
            'property1'=>'value1',
            'property2'=>'value2',
        ),
        // 其他控制器
    ),
);

然后, 一个在控制里的  a 行为就可以通过  路由  xyz/a 来访问了.



检验器

校验器主要用在 模型类(继承自 CFormModel 或者 CActiveRecord)中.假设校验器类 XyzClass 属于 xyz 扩展,我们可以在我们的模型类中通过 CModel::rules 重写 CModel::rules 来使用它:

class MyModel extends CActiveRecord // or CFormModel{
    public function rules()
    {
        return array(
            array(
                'attr1, attr2',
                'application.extensions.xyz.XyzClass',
                'property1'=>'value1',
                'property2'=>'value2',
            ),
            // 其他校验规则
        );
    }}


控制台命令

控制台命令扩展通常使用一个额外的命令来增强 yiic 的功能.假设命令控制台 XyzClass 属于 xyz 扩展,我们可以通过设定控制台应用的配置来使用它:

return array(
    'commandMap'=>array(
        'xyz'=>array(
            'class'=>'application.extensions.xyz.XyzClass',
            'property1'=>'value1',
            'property2'=>'value2',
        ),
        // 其他命令
    ),
);

然后,我们就能使用配备了额外命令 xyz 的 yiic 工具了.


通用部件

使用一个通用 部件, 我们首先需要通过使用

Yii::import('application.extensions.xyz.XyzClass');

来包含它的类文件.然后,我们既可以创建一个类的实例,配置它的属性,也可以调用它的方法.我们还可以创建一个新的子类来扩展它.





Using 3rd-Party Libraries(使用第三方库)

Yii是精心设计,使第三方库可易于集成,进一步扩大Yii的功能。 当在一个项目中使用第三方库,程序员往往遇到关于类命名和文件包含的问题。 因为所有Yii类以C字母开头,这就减少可能会出现的类命名问题;而且因为Yii依赖SPL autoload执行类文件包含,如果他们使用相同的自动加载功能或PHP包含路径包含类文件,它可以很好地结合。

下面我们用一个例子来说明如何在一个Yii application从Zend framework使用Zend_Search_Lucene部件。

首先,假设protectedapplication base directory,我们提取Zend Framework的发布文件到protected/vendors目录 。 确认protected/vendors/Zend/Search/Lucene.php文件存在。

第二,在一个controller类文件的开始,加入以下行:

Yii::import('application.vendors.*');
require_once('Zend/Search/Lucene.php');

上述代码包含类文件Lucene.php。因为我们使用的是相对路径,我们需要改变PHP的包含路径,以使文件可以正确定位。这是通过在require_once之前调用Yii::import做到。

一旦上述设立准备就绪后,我们可以在controller action里使用Lucene类,类似如下:

$lucene=new Zend_Search_Lucene($pathOfIndex);
$hits=$lucene->find(strtolower($keyword));


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值