NotifyBehavior.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: NODELOG
  5. * Date: 2017/3/12
  6. * Time: 下午4:49
  7. */
  8. namespace common\behaviors;
  9. use common\models\Article;
  10. use common\models\Comment;
  11. use common\models\Reward;
  12. use common\models\Suggest;
  13. use common\models\Vote;
  14. use common\traits\EntityTrait;
  15. use Yii;
  16. use yii\base\Behavior;
  17. use yii\base\Event;
  18. use yii\db\ActiveRecord;
  19. use yii\helpers\Markdown;
  20. use yii\helpers\StringHelper;
  21. use yii\web\Application;
  22. class NotifyBehavior extends Behavior
  23. {
  24. public function events()
  25. {
  26. return [
  27. Application::EVENT_BEFORE_REQUEST => 'bindEvent',
  28. ];
  29. }
  30. public function bindEvent($event)
  31. {
  32. Event::on(ActiveRecord::className(), 'afterInsert', [$this, 'afterInsert']);
  33. }
  34. public function afterInsert($event)
  35. {
  36. $entity = get_class($event->sender);
  37. switch ($entity) {
  38. case 'common\models\Comment':
  39. $fromUid = $event->sender->user_id;
  40. // 如果是回复,发站内信,通知什么的
  41. if ($event->sender->parent_id > 0) {
  42. $toUid = $event->sender->reply_uid ?: $event->sender->parent->user_id;
  43. $category = 'reply';
  44. $extra = [
  45. 'entity' => $event->sender->entity,
  46. 'entity_id' => $event->sender->entity_id,
  47. 'comment_id' => $event->sender->id,
  48. 'comment' => $this->generateMsgContent($event->sender->content)
  49. ];
  50. } else {
  51. switch ($event->sender->entity) {
  52. case 'common\models\Article':
  53. $category = 'comment_article';
  54. $article = Article::findOne($event->sender->entity_id);
  55. $toUid = $article->user_id;
  56. $extra = [
  57. 'comment' => $this->generateMsgContent($event->sender->content),
  58. 'comment_id' => $event->sender->id,
  59. 'entity' => $event->sender->entity,
  60. 'entity_title' => $article->title,
  61. 'entity_id' => $article->id
  62. ];
  63. break;
  64. case 'common\models\Suggest':
  65. $category = 'comment_suggest';
  66. $suggest = Suggest::findOne($event->sender->entity_id);
  67. $toUid = $suggest->user_id;
  68. $extra = [
  69. 'comment' => $this->generateMsgContent($event->sender->content),
  70. 'comment_id' => $event->sender->id,
  71. 'entity' => $event->sender->entity,
  72. 'entity_title' => $suggest->title,
  73. 'entity_id' => $event->sender->entity_id
  74. ];
  75. break;
  76. default:
  77. return;
  78. break;
  79. }
  80. }
  81. Yii::$app->notify->category($category)
  82. ->from($fromUid)
  83. ->to($toUid)
  84. ->extra($extra)
  85. ->send();
  86. break;
  87. case 'common\models\Suggest':
  88. $category = 'suggest';
  89. $fromUid = $event->sender->user_id;
  90. $toUid = 1; // 先写死
  91. $extra = [
  92. 'title' => $this->generateMsgContent($event->sender->content),
  93. 'entity_id' => $event->sender->id
  94. ];
  95. Yii::$app->notify->category($category)
  96. ->from($fromUid)
  97. ->to($toUid)
  98. ->extra($extra)
  99. ->send();
  100. break;
  101. case 'common\models\Vote':
  102. // 赞才发通知
  103. if ($event->sender->action == Vote::ACTION_UP) {
  104. $fromUid = $event->sender->user_id;
  105. switch ($event->sender->entity) {
  106. case 'common\models\Article':
  107. $category = 'up_article';
  108. $article = Article::findOne($event->sender->entity_id);
  109. $toUid = $article->user_id;
  110. $extra = [
  111. 'entity_title' => $article->title,
  112. 'entity_id' => $article->id
  113. ];
  114. break;
  115. case 'common\models\Comment':
  116. $category = 'up_comment';
  117. $comment = Comment::findOne($event->sender->entity_id);
  118. $toUid = $comment->user_id;
  119. $extra = [
  120. 'comment_title' => $this->generateMsgContent($comment->content),
  121. 'comment_id' => $comment->id,
  122. 'entity' => $comment->entity,
  123. 'entity_id' => $comment->entity_id
  124. ];
  125. break;
  126. default:
  127. return;
  128. break;
  129. }
  130. \Yii::$app->notify->category($category)
  131. ->from($fromUid)
  132. ->to($toUid)
  133. ->extra($extra)
  134. ->send();
  135. }
  136. break;
  137. case 'common\models\Favourite':
  138. $article = $event->sender->article;
  139. $fromUid = $event->sender->user_id;
  140. $toUid = $article->user_id;
  141. $extra = [
  142. 'entity_title' => $article->title,
  143. 'entity_id' => $article->id
  144. ];
  145. Yii::$app->notify->category('favourite')
  146. ->from($fromUid)
  147. ->to($toUid)
  148. ->extra($extra)
  149. ->send();
  150. break;
  151. case 'common\\modules\\message\\models\\Message':
  152. Yii::$app->notify->category('message')
  153. ->from($event->sender->from_uid)
  154. ->to($event->sender->to_uid)
  155. ->extra(['message' => $event->sender->data->content])
  156. ->send();
  157. break;
  158. case 'common\\models\\Reward':
  159. $article = $event->sender->article;
  160. Yii::$app->notify->category('reward')
  161. ->from($event->sender->user_id)
  162. ->to($article->user_id)
  163. ->extra([
  164. 'article_title' => $article->title,
  165. 'article_id' => $article->id,
  166. 'money' => $event->sender->money,
  167. 'comment' => $event->sender->comment
  168. ])
  169. ->send();
  170. break;
  171. case 'common\\models\\Friend':
  172. Yii::$app->notify->category('follow')
  173. ->from($event->sender->owner_id)
  174. ->to($event->sender->friend_id)
  175. ->send();
  176. break;
  177. }
  178. }
  179. private function generateMsgContent($content)
  180. {
  181. return StringHelper::truncate(preg_replace('/\s+/', ' ', strip_tags(Markdown::process($content))), 50);
  182. }
  183. }