'require|checkPost', 'origin_id' => 'max:100|checkOriginId', 'user_id' => 'require|integer|gt:0|checkUser|checkBody', 'content' => 'max:16000', 'images' => 'array|checkImages', 'post_type' => 'require|in:0,1,2', 'match_id' => 'require|integer|egt:0|checkMatch', 'tag_ids' => 'array|checkTags', 'is_paid' => 'require|in:0,1|checkPayment', 'price_points' => 'require|integer|egt:0|elt:10000', 'free_content_len' => 'require|integer|egt:0|elt:501|checkFreeContentLen', 'paid_count' => 'require|integer|egt:0|elt:4294967296', 'view_count' => 'require|integer|egt:0|elt:4294967296', 'like_count' => 'require|integer|egt:0|elt:4294967296', 'comment_count' => 'require|integer|egt:0|elt:4294967296', 'share_count' => 'require|integer|egt:0|elt:4294967296', 'ext' => 'checkExt', 'status' => 'require|in:0,1,2', 'is_top' => 'require|in:0,1', 'is_hot' => 'require|in:0,1', 'is_recommend' => 'require|in:0,1', 'sort' => 'require|integer|egt:0|elt:1000000', 'is_topic' => 'require|in:0,1', 'category_id' => 'require|integer|egt:0|checkCategory', 'create_time' => 'require|checkDateTime', ]; protected $message = [ 'id.require' => '帖子id不能为空', 'status.require' => '状态不能为空', 'content.max' => '帖子内容不能超过16000个字符', 'origin_id.max' => '来源标识不能超过100个字符', 'user_id.require' => '用户ID不能为空', 'images.array' => '帖子图片格式错误', 'post_type.in' => '帖子类型错误', 'match_id.egt' => '赛事ID不能小于0', 'tag_ids.array' => '帖子标签格式错误', 'price_points.elt' => '积分价格范围为0~9999', 'free_content_len.elt' => '免费预览字数不能超过500', 'create_time.require' => '发布时间不能为空', ]; public function sceneDetail() { return $this->only(['id']); } public function sceneDelete() { return $this->only(['id']); } public function sceneStatus() { return $this->only(['id', 'status']); } public function sceneEdit() { return $this->only([ 'id', 'origin_id', 'user_id', 'content', 'images', 'post_type', 'category_id', 'match_id', 'tag_ids', 'is_paid', 'price_points', 'free_content_len', 'paid_count', 'view_count', 'like_count', 'comment_count', 'share_count', 'ext', 'is_top', 'is_hot', 'is_recommend', 'is_topic', 'sort', 'status', 'create_time', ]); } public function sceneTop() { return $this->only(['id', 'is_top']); } public function sceneHot() { return $this->only(['id', 'is_hot']); } public function sceneRecommend() { return $this->only(['id', 'is_recommend']); } public function sceneSort() { return $this->only(['id', 'sort']); } public function sceneTopic() { return $this->only(['id', 'is_topic']); } public function sceneCategory() { return $this->only(['id', 'category_id']); } public function checkPost($value) { $post = CommunityPost::findOrEmpty($value); if ($post->isEmpty()) { return '帖子不存在'; } return true; } public function checkOriginId($value, $rule, $data) { $originId = trim((string) $value); if ($originId === '') { return true; } $exists = Db::name('community_post') ->where('origin_id', $originId) ->where('id', '<>', (int) ($data['id'] ?? 0)) ->count(); return $exists > 0 ? '来源标识已存在' : true; } public function checkUser($value) { return User::where('id', $value)->count() > 0 ? true : '用户不存在'; } public function checkBody($value, $rule, $data) { if (trim((string) ($data['content'] ?? '')) === '' && empty($data['images'])) { return '帖子内容和图片不能同时为空'; } return true; } public function checkImages($value) { if (count($value) > 18) { return '帖子图片最多18张'; } foreach ($value as $image) { if (!is_string($image) || trim($image) === '') { return '帖子图片地址格式错误'; } } return true; } public function checkMatch($value) { if ((int) $value === 0) { return true; } return Db::name('match')->where('id', $value)->count() > 0 ? true : '关联赛事不存在'; } public function checkTags($value) { $tagIds = array_values(array_unique(array_map('intval', $value))); if (count($tagIds) > 3) { return '帖子标签最多选择3个'; } if (!$tagIds) { return true; } return CommunityTag::whereIn('id', $tagIds)->count() === count($tagIds) ? true : '帖子标签不存在'; } public function checkPayment($value, $rule, $data) { if ((int) $value === 1 && (int) ($data['price_points'] ?? 0) <= 0) { return '付费帖子必须设置积分价格'; } return true; } public function checkFreeContentLen($value, $rule, $data) { if ((int) ($data['is_paid'] ?? 0) === 1 && (int) $value < 20) { return '付费帖子免费预览字数不能少于20'; } return true; } public function checkExt($value) { if (is_array($value) || trim((string) $value) === '') { return true; } json_decode((string) $value, true); return json_last_error() === JSON_ERROR_NONE ? true : '扩展数据必须是有效的JSON'; } public function checkDateTime($value) { return strtotime((string) $value) !== false ? true : '发布时间格式错误'; } public function checkCategory($value, $rule, $data) { if ((int) $value === 0) { return true; } $category = CommunityCategory::where('id', $value)->findOrEmpty(); if ($category->isEmpty()) { return '帖子分类不存在'; } if ((int) $category->status !== 1) { $currentCategoryId = (int) CommunityPost::where('id', $data['id'] ?? 0)->value('category_id'); if ($currentCategoryId !== (int) $value) { return '帖子分类已禁用'; } } return true; } }