request->getPost(); $question = $this->checkQuestion($post['question_id']); $user = $this->getLoginUser(); $validator = new UserLimitValidator(); $validator->checkDailyAnswerLimit($user); $validator = new AnswerValidator(); $validator->checkIfAllowAnswer($question, $user); $answer = new AnswerModel(); $data = $this->handlePostData($post); $data['published'] = $this->getPublishStatus($user); $data['question_id'] = $question->id; $data['owner_id'] = $user->id; $answer->create($data); if ($answer->published == AnswerModel::PUBLISH_APPROVED) { $question->last_answer_id = $answer->id; $question->last_replier_id = $answer->owner_id; $question->last_reply_time = $answer->create_time; $question->update(); if ($answer->owner_id != $question->owner_id) { $this->handleAnswerPostPoint($answer); $this->handleQuestionAnsweredNotice($answer); } } $this->saveDynamicAttrs($answer); $this->incrUserDailyAnswerCount($user); $this->recountQuestionAnswers($question); $this->recountUserAnswers($user); $this->eventsManager->fire('Answer:afterCreate', $this, $answer); return $answer; } protected function incrUserDailyAnswerCount(UserModel $user) { $this->eventsManager->fire('UserDailyCounter:incrAnswerCount', $this, $user); } protected function recountQuestionAnswers(QuestionModel $question) { $questionRepo = new QuestionRepo(); $answerCount = $questionRepo->countAnswers($question->id); $question->answer_count = $answerCount; $question->update(); } protected function recountUserAnswers(UserModel $user) { $userRepo = new UserRepo(); $answerCount = $userRepo->countAnswers($user->id); $user->answer_count = $answerCount; $user->update(); } protected function handleQuestionAnsweredNotice(AnswerModel $answer) { $notice = new QuestionAnsweredNotice(); $notice->handle($answer); } protected function handleAnswerPostPoint(AnswerModel $answer) { $service = new AnswerPostPointHistory(); $service->handle($answer); } }