`
hudeyong926
  • 浏览: 2033265 次
  • 来自: 武汉
社区版块
存档分类
最新评论

YII Behavior重用

 
阅读更多

用behavior的好处是可以通过“插入”的方式来获得新的功能。你当然可以直接把代码写在model里。不过如果类似的代码需要在若干个model里实现,那么behavior就可以让你重用这段代码

 

1.CActiveRecordBehavior

yii框架已经提供了一个CTimestampBehavior 行为类,只要设置好createAttribute和updateAttribute两个属性,,它分别对应你数据库表的创建时间和更新时间字段。像创建一篇文章时我们通常都会需要记录创建时间,更新时记录它的更新时间,详细使用,在你的Model类中behaviors 方法中增加下面几行, 将 createAttribute和updateAttribute更改为你数据库对应的时间字段即可:

public function behaviors(){
	return array(
		'CTimestampBehavior' => array(
			'class' => 'zii.behaviors.CTimestampBehavior',
			'createAttribute' => 'create_time_attribute',
			'updateAttribute' => 'update_time_attribute',
		)
	);
}

XSS安全模式类

在这篇文章里,我们将描述一个基于WEB应用下避免不合法的内容注入。

我们要在一个行为里使用htmlpurifier 类,用这种行为可以加强任何模型并表明各属性我们想让它们XSS安全。

我写了以下行为:

<?php
class CSafeContentBehavior extends CActiveRecordBehavior
{
	public $attributes =array();
	protected $purifier;

	function __construct(){
		$this->purifier = new CHtmlPurifier;
	}

	public function beforeSave($event)
	{
		foreach($this->attributes as $attribute){
			$this->getOwner()->{$attribute} = $this->purifier->purify($this->getOwner()->{$attribute});
		}
	}
}

把这个类放在你的应用程序目录,例如:application/behaviors/CSafeContentBehavior.php。现在你在模型的行为中这样去写:

<?php
class Post extends CActiveRecord
{
	public function behaviors(){
	    return array(
	        'CSafeContentBehavor' => array( 
	            'class' => 'application.behaviors.CSafeContentBehavior',
	            'attributes' => array('title', 'body'),
	        ),
	    );
	}
}

现在我们可以开始了。我们的post模型在每个保存操作中将净化标题和内容列。

 

保存一条记录后,更新订单号,适合所有订单号

<?php
class No13Behavior extends CActiveRecordBehavior {
    public $pk = '';
    public $orderNo = '';
    public $prefix = '';

    public function afterSave($event) {
        if ($this->getOwner()->getIsNewRecord()) {
            if (empty($this->pk) || empty($this->orderNo) || empty($this->prefix)) {
                return false;
            }
            $id = $this->getOwner()->{$this->pk};
            $val = $this->prefix . date('ymd') . str_pad($id, 5, '0', STR_PAD_LEFT);
            $this->getOwner()->updateByPk($id, array($this->orderNo =>$val) );
        }
    }
}

 2.CBehavior

自动导入module模块,config/main的modules不需要加对应的module名。可以在数据库中配置

<?php
/**
 * ApplicationConfigBehavior is a behavior for the application.
 * It loads additional config parameters that cannot be statically
 * written in config/main
 */
class ModuleBehavior extends CBehavior {
    /**
     * Declares events and the event handler methods
     * See yii documentation on behavior
     */
    public function events() {
        return array_merge(parent::events(), array(
            'onBeginRequest' => 'beginRequest',
        ));
    }

    /**
     * Load configuration that cannot be put in config/main
     */
    public function beginRequest() {
        $modules = array();
        $model = Module::model()->findAll(); // Todo - should be per application
        foreach ($model as $item) {
            $modules[$item->name] = array(); // Todo can set parameters here for each module...
        }
        //$modules['video'] = array();
        Yii::app()->setModules($modules);
    }
}
?>
'behaviors' => array(
    'theme' => 'application.components.behaviors.ThemeBehavior',
    'lang'  => 'application.components.behaviors.LangBehavior',
    'module'=> 'application.components.behaviors.ModuleBehavior'
),
 上面main也可以替代index.php
$app = Yii::createWebApplication($config);
$app->attachBehavior('module','application.components.behaviors.ModuleBehavior');
在protectd/components/behaviors增加2个Behavior:
<?php
//ThemeBehavior.php
class ThemeBehavior extends CBehavior {
    const COOKIE_KEY = '__theme';

    public function events() {
        return array_merge(parent::events(), array(
            'onBeginRequest' => 'beginRequest',
        ));
    }

    public function beginRequest() {
        $v = Yii::app()->request->getParam(self::COOKIE_KEY);
        if (!isset($v)) {
            $v = Yii::app()->request->cookies[self::COOKIE_KEY];
            if (!isset($v)) {
                $v = Yii::app()->theme->name;
            } else {
                $v = $v->value;
            }
        }
        Yii::app()->theme = $v;
        Yii::app()->request->cookies[self::COOKIE_KEY] = new CHttpCookie(self::COOKIE_KEY, $v);
    }
}
LangBehavior.php
<?php
//LangBehavior.php
class LangBehavior extends CBehavior {
    const COOKIE_KEY = '__lang';

    public function events() {
        return array_merge(parent::events(), array(
            'onBeginRequest' => 'beginRequest',
        ));
    }

    public function beginRequest() {
        $v = Yii::app()->request->getParam(self::COOKIE_KEY);
        if (!isset($v)) {
            $v = Yii::app()->request->cookies[self::COOKIE_KEY];
            if (!isset($v)) {
                $v = Yii::app()->language;
            } else {
                $v = $v->value;
            }
        }
        Yii::app()->language = $v;
        Yii::app()->request->cookies[self::COOKIE_KEY] = new CHttpCookie(self::COOKIE_KEY, $v);
    }
}
 

 

 

 

分享到:
评论

相关推荐

    YII2框架中behavior行为的理解与使用方法示例

    在YII2中,behavior(行为)是极为重要的概念,它允许开发者在不修改原有类的基础上增加新的方法和属性,从而实现对组件功能的扩展。下面将对YII2中的behavior进行详细解析,包括其功能、原理、使用方法及注意事项。...

    php yii源码分析

    Yii 的组件系统是其核心特性之一,允许开发者定义和管理可重用的代码块。在构造函数中,`registerCoreComponents` 方法会注册一系列核心组件,比如数据库访问的 `db` 组件,日志处理的 `log` 组件等。这些组件可以...

    yii-demo:Yii 框架扩展的演示

    在 "yii-demo" 中,你可能会发现一些自定义组件,如行为(Behavior)和小部件(Widget),它们提高了代码的可重用性和灵活性。 3. **数据库操作**:Yii 的 ActiveRecord 类简化了数据库操作,提供了一种对象关系...

    YII框架行为behaviors用法示例

    YII框架中的behaviors,中文翻译为“行为”,是YII框架中用于增加代码可重用性和模块性的一种设计模式。在YII中,一个行为是一组可以附加到组件(如控制器、模型等)上的公共方法和属性。这些方法和属性可以扩展或...

    Yii框架组件和事件行为管理详解

    在Yii中,组件(Component)和事件行为管理(Event and Behavior Management)是其核心特性,它们使得代码更加模块化和可复用,同时提供了强大的扩展性。 **组件管理** 在Yii中,组件是一种具有独立功能的对象,...

    YII框架实现自定义第三方扩展操作示例

    在YII框架中,行为可以看作是可以附加到组件或模型上的可重用代码块,它们可以实现各种插件式的功能,例如数据验证、日志记录等。 此外,YII框架的单例模式在全局访问应用实例时非常有用。`Yii::$app`是一个单例...

    yii2行为的方法如何注入到组件类中详解

    在Yii2框架中,行为(Behavior)是一种灵活的设计模式,它允许开发者将独立的功能模块附加到任何类上,尤其适用于组件类。...这种机制增强了代码的可维护性和可重用性,是Yii2框架中一种非常有用的设计模式。

    详解在PHP的Yii框架中使用行为Behaviors的方法

    在Yii框架中使用行为Behaviors是该...总之,Yii框架中的行为是一种强大的代码重用和扩展机制。通过将可复用的功能封装在行为中,并在需要时附加到组件,可以有效地管理项目的代码结构,并提升代码的复用性和可维护性。

Global site tag (gtag.js) - Google Analytics