> */ public function rules(): array { $type = $this->input('type', 'discussion'); $severities = Discussion::SEVERITIES[$type] ?? []; $isAnnotation = in_array($type, Discussion::INJECTED_TYPES, true); // 锚点只有批注收:评论线程传了 422,免得静默丢掉 $anchor = fn (array $rules) => $isAnnotation ? ['sometimes', 'nullable', ...$rules] : ['prohibited']; return [ 'target_type' => ['required', 'string', Rule::in($isAnnotation ? ['sentence'] : Discussion::TARGET_TYPES)], 'target_id' => ['required', 'uuid'], 'type' => ['sometimes', 'string', Rule::in(Discussion::COMMENT_TYPES)], 'title' => $isAnnotation ? ['sometimes', 'nullable', 'string', 'max:256'] : ['required', 'string', 'max:256'], 'content' => match ($type) { Discussion::TYPE_COMMENTARY => ['required', 'string', 'max:20000', 'regex:'.Discussion::COMMENTARY_PATTERN], Discussion::TYPE_NOTE => ['required', 'string', 'max:20000'], default => ['sometimes', 'nullable', 'string', 'max:20000'], }, 'severity' => $severities === [] ? ['prohibited'] : ['sometimes', 'nullable', 'string', Rule::in($severities)], 'pos_start' => $anchor(['integer', 'min:0']), 'pos_end' => $anchor(['integer', 'min:0', 'gte:pos_start']), 'quote_exact' => $anchor(['string', 'max:1024']), 'quote_prefix' => $anchor(['string', 'max:1024']), 'quote_suffix' => $anchor(['string', 'max:1024']), 'tpl_id' => ['sometimes', 'nullable', 'uuid'], 'notify' => ['sometimes', 'boolean'], ]; } /** * @return array */ public function messages(): array { $messages = [ 'content.regex' => __('messages.discussion_commentary_format'), 'severity.prohibited' => __('messages.discussion_severity_not_allowed'), ]; if (in_array($this->input('type'), Discussion::INJECTED_TYPES, true)) { $messages['target_type.in'] = __('messages.discussion_annotation_target'); } foreach (self::ANCHOR_FIELDS as $field) { $messages["{$field}.prohibited"] = __('messages.discussion_anchor_thread'); } return $messages; } }