checkReview($id); $user = $this->getLoginUser(); $validator = new UserLimitValidator(); $validator->checkDailyReviewLikeLimit($user); $likeRepo = new ReviewLikeRepo(); $reviewLike = $likeRepo->findReviewLike($review->id, $user->id); if (!$reviewLike) { $reviewLike = new ReviewLikeModel(); $reviewLike->review_id = $review->id; $reviewLike->user_id = $user->id; $reviewLike->create(); } else { $reviewLike->deleted = $reviewLike->deleted == 1 ? 0 : 1; $reviewLike->update(); } $this->incrUserDailyReviewLikeCount($user); if ($reviewLike->deleted == 0) { $action = 'do'; $this->incrReviewLikeCount($review); $this->handleLikeNotice($review, $user); $this->eventsManager->fire('Review:afterLike', $this, $review); } else { $action = 'undo'; $this->decrReviewLikeCount($review); $this->eventsManager->fire('Review:afterUndoLike', $this, $review); } $isOwner = $user->id == $review->owner_id; /** * 仅首次点赞发送通知 */ if (!$reviewLike && !$isOwner) { $this->handleLikeNotice($review, $user); } return [ 'action' => $action, 'count' => $review->like_count, ]; } protected function incrReviewLikeCount(ReviewModel $review) { $review->like_count += 1; $review->update(); } protected function decrReviewLikeCount(ReviewModel $review) { if ($review->like_count > 0) { $review->like_count -= 1; $review->update(); } } protected function incrUserDailyReviewLikeCount(UserModel $user) { $this->eventsManager->fire('UserDailyCounter:incrReviewLikeCount', $this, $user); } protected function handleLikeNotice(ReviewModel $review, UserModel $sender) { $notice = new ReviewLikedNotice(); $notice->handle($review, $sender); } }