YII Behavior重用

简介:

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

 

1.CActiveRecordBehavior

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

Java代码   收藏代码
  1. public function behaviors(){  
  2.     return array(  
  3.         'CTimestampBehavior' => array(  
  4.             'class' => 'zii.behaviors.CTimestampBehavior',  
  5.             'createAttribute' => 'create_time_attribute',  
  6.             'updateAttribute' => 'update_time_attribute',  
  7.         )  
  8.     );  
  9. }  

XSS安全模式类

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

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

我写了以下行为:

Java代码   收藏代码
  1. <?php  
  2. class CSafeContentBehavior extends CActiveRecordBehavior  
  3. {  
  4.     public $attributes =array();  
  5.     protected $purifier;  
  6.   
  7.     function __construct(){  
  8.         $this->purifier = new CHtmlPurifier;  
  9.     }  
  10.   
  11.     public function beforeSave($event)  
  12.     {  
  13.         foreach($this->attributes as $attribute){  
  14.             $this->getOwner()->{$attribute} = $this->purifier->purify($this->getOwner()->{$attribute});  
  15.         }  
  16.     }  
  17. }  

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

Java代码   收藏代码
  1. <?php  
  2. class Post extends CActiveRecord  
  3. {  
  4.     public function behaviors(){  
  5.         return array(  
  6.             'CSafeContentBehavor' => array(   
  7.                 'class' => 'application.behaviors.CSafeContentBehavior',  
  8.                 'attributes' => array('title''body'),  
  9.             ),  
  10.         );  
  11.     }  
  12. }  

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

 

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

Java代码   收藏代码
  1. <?php  
  2. class No13Behavior extends CActiveRecordBehavior {  
  3.     public $pk = '';  
  4.     public $orderNo = '';  
  5.     public $prefix = '';  
  6.   
  7.     public function afterSave($event) {  
  8.         if ($this->getOwner()->getIsNewRecord()) {  
  9.             if (empty($this->pk) || empty($this->orderNo) || empty($this->prefix)) {  
  10.                 return false;  
  11.             }  
  12.             $id = $this->getOwner()->{$this->pk};  
  13.             $val = $this->prefix . date('ymd') . str_pad($id, 5'0', STR_PAD_LEFT);  
  14.             $this->getOwner()->updateByPk($id, array($this->orderNo =>$val) );  
  15.         }  
  16.     }  
  17. }  

 2.CBehavior

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

Java代码   收藏代码
  1. <?php  
  2. /** 
  3.  * ApplicationConfigBehavior is a behavior for the application. 
  4.  * It loads additional config parameters that cannot be statically 
  5.  * written in config/main 
  6.  */  
  7. class ModuleBehavior extends CBehavior {  
  8.     /** 
  9.      * Declares events and the event handler methods 
  10.      * See yii documentation on behavior 
  11.      */  
  12.     public function events() {  
  13.         return array_merge(parent::events(), array(  
  14.             'onBeginRequest' => 'beginRequest',  
  15.         ));  
  16.     }  
  17.   
  18.     /** 
  19.      * Load configuration that cannot be put in config/main 
  20.      */  
  21.     public function beginRequest() {  
  22.         $modules = array();  
  23.         $model = Module::model()->findAll(); // Todo - should be per application  
  24.         foreach ($model as $item) {  
  25.             $modules[$item->name] = array(); // Todo can set parameters here for each module...  
  26.         }  
  27.         //$modules['video'] = array();  
  28.         Yii::app()->setModules($modules);  
  29.     }  
  30. }  
  31. ?>  
Main.php代码   收藏代码
  1. 'behaviors' => array(  
  2.     'theme' => 'application.components.behaviors.ThemeBehavior',  
  3.     'lang'  => 'application.components.behaviors.LangBehavior',  
  4.     'module'=> 'application.components.behaviors.ModuleBehavior'  
  5. ),  
 上面main也可以替代index.php
Java代码   收藏代码
  1. $app = Yii::createWebApplication($config);  
  2. $app->attachBehavior('module','application.components.behaviors.ModuleBehavior');  
在protectd/components/behaviors增加2个Behavior:
Java代码   收藏代码
  1. <?php  
  2. //ThemeBehavior.php  
  3. class ThemeBehavior extends CBehavior {  
  4.     const COOKIE_KEY = '__theme';  
  5.   
  6.     public function events() {  
  7.         return array_merge(parent::events(), array(  
  8.             'onBeginRequest' => 'beginRequest',  
  9.         ));  
  10.     }  
  11.   
  12.     public function beginRequest() {  
  13.         $v = Yii::app()->request->getParam(self::COOKIE_KEY);  
  14.         if (!isset($v)) {  
  15.             $v = Yii::app()->request->cookies[self::COOKIE_KEY];  
  16.             if (!isset($v)) {  
  17.                 $v = Yii::app()->theme->name;  
  18.             } else {  
  19.                 $v = $v->value;  
  20.             }  
  21.         }  
  22.         Yii::app()->theme = $v;  
  23.         Yii::app()->request->cookies[self::COOKIE_KEY] = new CHttpCookie(self::COOKIE_KEY, $v);  
  24.     }  
  25. }  
LangBehavior.php
Java代码   收藏代码
  1. <?php  
  2. //LangBehavior.php  
  3. class LangBehavior extends CBehavior {  
  4.     const COOKIE_KEY = '__lang';  
  5.   
  6.     public function events() {  
  7.         return array_merge(parent::events(), array(  
  8.             'onBeginRequest' => 'beginRequest',  
  9.         ));  
  10.     }  
  11.   
  12.     public function beginRequest() {  
  13.         $v = Yii::app()->request->getParam(self::COOKIE_KEY);  
  14.         if (!isset($v)) {  
  15.             $v = Yii::app()->request->cookies[self::COOKIE_KEY];  
  16.             if (!isset($v)) {  
  17.                 $v = Yii::app()->language;  
  18.             } else {  
  19.                 $v = $v->value;  
  20.             }  
  21.         }  
  22.         Yii::app()->language = $v;  
  23.         Yii::app()->request->cookies[self::COOKIE_KEY] = new CHttpCookie(self::COOKIE_KEY, $v);  
  24.     }  
  25. }  
  
相关文章
Ant Design Pro: 请求接口函数复用
Ant Design Pro: 请求接口函数复用
|
存储 缓存 Java
yii\caching\CacheInterface 接口是干什么的?底层原理是什么?
yii\caching\CacheInterface 接口是干什么的?底层原理是什么?
|
数据库连接 PHP 数据库
Yii2如何使用ActiveRecord?
Yii2如何使用ActiveRecord?
155 0
|
前端开发 JavaScript PHP
Yii2的视图是什么?底层原理是什么?
Yii2的视图是什么?底层原理是什么?
|
前端开发
React+hook+ts+ant design封装一个table的组件
React+hook+ts+ant design封装一个table的组件
325 0
React+hook+ts+ant design封装一个table的组件
|
前端开发 测试技术 API
Jetpack MVVM 使用错误(五):ViewModel 接口暴露不合理
Jetpack 提倡单向数据流架构,ViewModel 对外暴露的接口如果不合理,将破坏数据流的单向流动。
198 0
|
JavaScript
Ant Design Vue 框架的a-table嵌套a-form-model达到验证效果
Ant Design Vue 框架的a-table嵌套a-form-model达到验证效果
1283 0
|
Python
Django的rest_framework的视图之Mixin类编写视图源码解析
Django的rest_framework的视图之Mixin类编写视图源码解析 Mixin类编写视图 我们这里用auther表来做演示,先为auther和autherdetail写2个url 1 2 url(r'^autherdetail/(?P\d+)', views.
1417 0