beforeAction / afterSave / 等
yii2 2017-07-17 14:55:50

 

1、在钩子函数中加错误断点

2、删除后afterDelete递归删除子级

3、添加文章标签表的behavior DEMO

4、添加全局beforeAction

 

on beforeAction 

 

PHP Code复制内容到剪贴板
  1. public function afterSave($insert$changedAttributes)    
  2. {    
  3.     parent::afterSave($insert$changedAttributes);    
  4.     if($insert) {    
  5.         //这里是新增数据    
  6.     } else {    
  7.         //这里是更新数据    
  8.     }      
  9. }  
  10.   
  11.   
  12.   
  13. public function beforeDelete()    
  14.     {    
  15.         parent::beforeDelete();    
  16.         //在这里做删除前的事情    
  17.         return true;    
  18. }  
  19.   
  20.   
  21. public function beforeSave($insert)    
  22. {    
  23.     parent::beforeSave($insert);    
  24.     if($insert) {    
  25.         //执行添加的情况    
  26.     } else {    
  27.         //执行更新的情况    
  28.     }    
  29.     return true;    
  30. }  

 

 

PHP Code复制内容到剪贴板
  1. public function beforeAction($action)  
  2. {  
  3.     if (in_array($action->id, ["material""participant""survey""survey-detail""schedule""schedule-detail""forum""sign-manage""weather""life"])) {  
  4.         $planId = \Yii::$app->request->get("planId");  
  5.         if (!$planId) {  
  6.             return $this->render('/cnooc/nopic');  
  7.         }  
  8.         $data = ['plan_id' => $planId'unique_code' => \Yii::$app->user->getId()];  
  9.         $role = $this->getParticipantRole($data);  
  10.   
  11.         if (!$role) {  
  12.             return $this->render('/cnooc/nopic', [  
  13.                 "role" => $role  
  14.             ]);  
  15.         }  
  16.         $this->role = $role;  
  17.         $this->appInfo = [  
  18.             'corp_id' => \Yii::$app->config->get("CORP_ID"),  
  19.             'secret' => \Yii::$app->config->get("SECRET_KEY"),  
  20.             'agent_id' => \Yii::$app->config->get("WEIXIN_MEET")['agentId'],  
  21.         ];  
  22.     }  
  23.     return parent::beforeAction($action);  
  24. }  

 

 

PHP Code复制内容到剪贴板
  1. /**   
  2.      * This is invoked after the record is saved.   
  3.      */    
  4.     public function afterSave($insert$changedAttributes)    
  5.     {    
  6.         parent::afterSave($insert$changedAttributes);    
  7.         Tag::updateFrequency($this->_oldTags, $this->tags,strtolower($this->getClassName()));    
  8.     }    

 

PHP Code复制内容到剪贴板
  1. // 发布新文章后(摘要为空的话根据内容生成摘要)  
  2.   
  3. public function afterSave($insert$changedAttributes)  
  4. {  
  5.     parent::afterSave($insert$changedAttributes);  
  6.     $article = Article::findOne(['id' => $this->id]);  
  7.     if (!emptyempty($article)) {  
  8.         if (emptyempty($article->description)) {  
  9.             $article->description = $this->generateDesc($this->getProcessedContent());  
  10.             $article->save();  
  11.         }  
  12.     }  
  13. }  

 

 

 

PHP Code复制内容到剪贴板
  1. public function afterDelete() {  
  2.     // delete dependencies  
  3.     Yii::$app->db->createCommand("DELETE FROM {{%banner_image}} WHERE banner_id=".$this->cacheId)->execute();  
  4.     parent::afterDelete();  
  5. }  

 

PHP Code复制内容到剪贴板
  1. /** 
  2.  * 递归删除子分类 
  3.  */  
  4. public function afterDelete()  
  5. {  
  6.     $ids = $this->getChildrenIds($this->id);  
  7.     self::deleteAll(["in","id",$ids]);  
  8.     parent::afterDelete();  
  9. }  
  10.   
  11. public function getChildrenIds($categoryId)  
  12. {  
  13.     $ids = '';  
  14.     $res = self::find()->where(["pid" => $categoryId])->all();  
  15.     if ($res) {  
  16.         foreach ($res as $val) {  
  17.             $ids .= $val['id'] . ',';  
  18.             $ids .= $this->getChildrenIds($val['id']);  
  19.         }  
  20.     }  
  21.     return $ids;  
  22. }  

 

在钩子函数中加错误断点

model中添加钩子函数

PHP Code复制内容到剪贴板
  1. public function beforeSave($insert)  
  2. {  
  3.     parent::beforeSave($insert); // TODO: Change the autogenerated stub  
  4.   
  5.     $parent_id = $this->parent_id;  
  6.     if ($parent_id) {  
  7.         $parent = self::findOne($parent_id);  
  8.         if ($parent) {  
  9.             // 如果有父级,节点层级加1  
  10.             $this->level = ($parent->level += 1);  
  11.         } else {  
  12.             throw new Exception("父级节点不存在");  
  13.             //$this->addError($attribute, '父级节点不存在');  
  14.         }  
  15.     }  
  16.     return true; // TODO: Change the autogenerated stub  
  17. }  

 

控制器中加try ... catch捕捉异常

PHP Code复制内容到剪贴板
  1. /** 
  2.  * 添加资料树节点 
  3.  * @return DocumentTree 
  4.  * @throws HttpException 
  5.  */  
  6. public function actionCreate()  
  7. {  
  8.     $post = Yii::$app->request->post();  
  9.     $model = new DocumentTree();  
  10.     $model->load($post"");  
  11.   
  12.     try{  
  13.         $model->save();  
  14.     }catch (Exception $e){  
  15.         p($e->getMessage());  
  16.     }  
  17.   
  18.     return $model;  
  19. }  

 

 

 

删除后afterDelete递归删除子级

PHP Code复制内容到剪贴板
  1. /** 
  2.  * 递归删除子分类 
  3.  */  
  4. public function afterDelete()  
  5. {  
  6.     $ids = $this->getChildrenIds($this->id);  
  7.     self::deleteAll(["in","id",$ids]);  
  8.     parent::afterDelete();  
  9. }  
  10.   
  11. public function getChildrenIds($categoryId)  
  12. {  
  13.     $ids = [];  
  14.     $res = self::find()->where(["pid" => $categoryId])->all();  
  15.     if ($res) {  
  16.         foreach ($res as $val) {  
  17.             $ids[] = $val['id'];  
  18.             $ids = array_merge($ids,$this->getChildrenIds($val['id']));  
  19.         }  
  20.     }  
  21.     return $ids;  
  22. }  

 

 

添加文章标签表的behavior DEMO:

PHP Code复制内容到剪贴板
  1. namespace common\behaviors;  
  2.   
  3.   
  4. use common\models\ArticleTag;  
  5. use common\models\Tag;  
  6. use yii\base\Behavior;  
  7. use yii\db\ActiveRecord;  
  8.   
  9. class TagBehavior extends Behavior  
  10. {  
  11.     private $_tags;  
  12.   
  13.     public static $formName = "tagItems";  
  14.   
  15.     public static $formLable = '标签';  
  16.   
  17.     public function events()  
  18.     {  
  19.         return [  
  20.             ActiveRecord::EVENT_INIT => 'initInternal',  
  21.             ActiveRecord::EVENT_AFTER_INSERT => 'afterSave',  
  22.             ActiveRecord::EVENT_AFTER_UPDATE => 'afterSave',  
  23.             ActiveRecord::EVENT_BEFORE_DELETE => 'beforeDelete',  
  24.         ];  
  25.     }  
  26.   
  27.     public function initInternal($event)  
  28.     {  
  29.   
  30.     }  
  31.     public function getTags()  
  32.     {  
  33.         return $this->owner->hasMany(Tag::className(), ['id' => 'tag_id'])  
  34.             ->viaTable('{{%article_tag}}', ['article_id' => 'id']);  
  35.     }  
  36.   
  37.     public function getTagItems()  
  38.     {  
  39.         if($this->_tags === null){  
  40.             $this->_tags = [];  
  41.             foreach($this->owner->tags as $tag) {  
  42.                 $this->_tags[] = $tag->name;  
  43.             }  
  44.         }  
  45.         return $this->_tags;  
  46.     }  
  47.   
  48.     public function getTagNames()  
  49.     {  
  50.         return join(' '$this->getTagItems());  
  51.     }  
  52.   
  53.     public function afterSave()  
  54.     {  
  55.         if (\Yii::$app->request->isConsoleRequest ) {  
  56.             return;  
  57.         }  
  58.         $data = \Yii::$app->request->post($this->owner->formName());  
  59.         if(isset($data[static::$formName])) {  
  60.             if(!$this->owner->isNewRecord) {  
  61.                 $this->beforeDelete();  
  62.             }  
  63.             if (!emptyempty($data[static::$formName])) {  
  64.                 $tags = $data[static::$formName];  
  65.                 foreach ($tags as $tag) {  
  66.                     $tagModel = Tag::findOne(['name' => $tag]);  
  67.                     if (emptyempty($tagModel)) {  
  68.                         $tagModel = new Tag();  
  69.                         $tagModel->name = $tag;  
  70.                         $tagModel->save();  
  71.                     }  
  72.                     $articleTag = new ArticleTag();  
  73.                     $articleTag->article_id = $this->owner->id;  
  74.                     $articleTag->tag_id = $tagModel->id;  
  75.                     $articleTag->save();  
  76.                 }  
  77.                 Tag::updateAllCounters(['article' => 1], ['name' => $tags]);  
  78.             }  
  79.         }  
  80.     }  
  81.   
  82.     public function beforeDelete()  
  83.     {  
  84.         $pks = [];  
  85.   
  86.         foreach($this->owner->tags as $tag){  
  87.             $pks[] = $tag->primaryKey;  
  88.         }  
  89.   
  90.         if (count($pks)) {  
  91.             Tag::updateAllCounters(['article' => -1], ['in''id'$pks]);  
  92.         }  
  93.         Tag::deleteAll(['article' => 0]);  
  94.         ArticleTag::deleteAll(['article_id' => $this->owner->id]);  
  95.     }  
  96. }  

 

 

afterFind 在asArray 不执行

PHP Code复制内容到剪贴板
  1. public function afterFind()  
  2. {  
  3.     parent::afterFind();  
  4.     echo "<PRE>";  
  5.     echo var_dump($this);  
  6.     echo "</PRE>";  
  7.     die();  
  8. }  

 

添加全局beforeAction

在config中添加on beforeAction

PHP Code复制内容到剪贴板
  1. 'on beforeAction' => function ($event) {  
  2.     $moduleId = \Yii::$app->controller->module->id;  
  3.     $controllerId = Yii::$app->controller->id;  
  4.     $actionId = Yii::$app->controller->action->id;  
  5.   
  6.     if ($actionId == "login" || $actionId == "logout") {  
  7.         return true;  
  8.     }  
  9.     if($moduleId == "invest"){  
  10.         // 投资管理模块直接放行  
  11.         return true;  
  12.     }  
  13.     if ($controllerId == "site" && $actionId == "index") {  
  14.         return true;  
  15.     }  
  16.     if ($actionId == "choose-project") {  
  17.         return true;  
  18.     }  
  19.     if (!isset($_COOKIE['current_project_id']) || !$_COOKIE['current_project_id']) {  
  20.         $url = Url::to(['/invest/contract-project/choose-project']);  
  21.         Yii::$app->response->redirect($url);  
  22.         Yii::$app->response->send();  
  23.     }  
  24. },  

 

PHP Code复制内容到剪贴板
  1. // 静态方法:  
  2. 'on beforeAction' => [common\components\WxComponent::className(),'getUser'],  
  3.   
  4. // 公共方法:  
  5. 'on beforeAction' => [new \common\components\WxComponent(),'getUser'], //这里之前一个坑就是构造函数报错  
  6.   
  7. 'on afterAction' => function ($event) {  
  8.         $wxComponent = new common\components\WxComponent();  
  9.         return $wxComponent->user;  
  10. },  

 

 

 

本文来自于:http://www.yoyo88.cn/study/yii2/122.html

上一篇 yii2.0 分页
Powered by yoyo苏ICP备15045725号