checkAnswer($id); $user = $this->getLoginUser(); $validator = new UserLimitValidator(); $validator->checkDailyAnswerLikeLimit($user); $likeRepo = new AnswerLikeRepo(); $answerLike = $likeRepo->findAnswerLike($answer->id, $user->id); if (!$answerLike) { $action = 'do'; $answerLike = new AnswerLikeModel(); $answerLike->answer_id = $answer->id; $answerLike->user_id = $user->id; $answerLike->create(); $this->incrAnswerLikeCount($answer); $this->handleLikeNotice($answer, $user); $this->eventsManager->fire('Answer:afterLike', $this, $answer); } else { $action = 'undo'; $answerLike->delete(); $this->decrAnswerLikeCount($answer); $this->eventsManager->fire('Answer:afterUndoLike', $this, $answer); } $this->incrUserDailyAnswerLikeCount($user); return [ 'action' => $action, 'count' => $answer->like_count, ]; } protected function incrAnswerLikeCount(AnswerModel $answer) { $answer->like_count += 1; $answer->update(); } protected function decrAnswerLikeCount(AnswerModel $answer) { if ($answer->like_count > 0) { $answer->like_count -= 1; $answer->update(); } } protected function incrUserDailyAnswerLikeCount(UserModel $user) { $this->eventsManager->fire('UserDailyCounter:incrAnswerLikeCount', $this, $user); } protected function handleLikeNotice(AnswerModel $answer, UserModel $sender) { $notice = new AnswerLikedNotice(); $notice->handle($answer, $sender); } }