| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | 
							- <?php
 
- /**
 
-  * Created by PhpStorm.
 
-  * Author: ljt
 
-  * DateTime: 2016/11/21 13:24
 
-  * Description:
 
-  */
 
- namespace common\behaviors;
 
- use common\modules\user\models\Profile;
 
- use yii\base\Behavior;
 
- use yii\helpers\ArrayHelper;
 
- use yii\helpers\StringHelper;
 
- use Yii;
 
- use common\models\UserBehaviorLog as Log;
 
- /**
 
-  * 记录用户行为
 
-  */
 
- class UserBehaviorBehavior extends Behavior
 
- {
 
-     const RULE = '/\{(.+?)(?:\{(.+)\})?\}/';
 
-     public $name;
 
-     public $eventName = [];
 
-     /**
 
-      * @var array 触发规则
 
-         ```
 
-         [
 
-             'cycle' => 24,
 
-             'max' => 1,
 
-             'counter' => 10,
 
-         ]
 
-         ```
 
-      */
 
-     public $rule;
 
-     /**
 
-      * @var array 附加数据
 
-      */
 
-     public $data = [];
 
-     /**
 
-      * @var string 日志内容格式
 
-      */
 
-     public $content;
 
-     public function events()
 
-     {
 
-         $events = [];
 
-         $this->eventName = (array) $this->eventName;
 
-         foreach ($this->eventName as $eventName) {
 
-             $events[$eventName] = 'execute';
 
-         }
 
-         return $events;
 
-     }
 
-     public function execute()
 
-     {
 
-         //执行行为规则
 
-         $execCount = Log::find()->where(['behavior_name' => $this->name, 'user_id' => Yii::$app->user->identity->id])->andWhere(['>', 'created_at', time() - intval($this->rule['cycle']) * 3600])->count();
 
-         if($execCount >= $this->rule['max']){
 
-             return;
 
-         }
 
-         // TODO 暂时只支持更新money字段
 
-         Profile::updateAllCounters(['money' => $this->rule['counter']], ['user_id' => Yii::$app->user->identity->id]);
 
-         //记录日志
 
-         $this->log();
 
-     }
 
-     private function log()
 
-     {
 
-         $this->parseContent($this->data);
 
-         $log = new Log();
 
-         $log->behavior_name = $this->name;
 
-         $log->user_id = Yii::$app->user->identity->id;
 
-         $log->content = $this->content;
 
-         $log->save(false);
 
-     }
 
-     protected function parseContent($data)
 
-     {
 
-         $data = array_merge(['user' => Yii::$app->user->identity], $data);
 
-         $specialValues = $this->getValues($this->content);
 
-         if (count($specialValues) > 0) {
 
-             $specialValues = array_filter($specialValues, function ($value) {
 
-                 return StringHelper::startsWith($value, 'extra.') || StringHelper::startsWith($value, 'user.');
 
-             });
 
-             foreach ($specialValues as $replacer) {
 
-                 $replace = ArrayHelper::getValue($data, $replacer);
 
-                 $this->content = $this->replaceContent($this->content, $replace, $replacer);
 
-             }
 
-         }
 
-     }
 
-     protected function getValues($body)
 
-     {
 
-         $values = [];
 
-         preg_match_all(self::RULE, $body, $values);
 
-         return $values[1];
 
-     }
 
-     protected function replaceContent($body, $valueMatch, $replacer)
 
-     {
 
-         $body = str_replace('{'.$replacer.'}', $valueMatch, $body);
 
-         return $body;
 
-     }
 
- }
 
 
  |