> */ public function rules(): array { return [ 'book' => ['integer', 'min:1', 'required_with:chapter,para,to'], // 章节起始段落号;服务端按 pali_texts 的 chapter_len 展开成段落区间 'chapter' => ['integer', 'min:1', 'prohibits:para,to'], 'para' => ['integer', 'min:1'], 'to' => ['integer', 'min:1'], // 逗号分隔多选,如 issue,glossary;不传只列话题(评论线程) 'type' => ['sometimes', 'string', 'regex:/^[a-z]+(,[a-z]+)*$/', function (string $attribute, mixed $value, Closure $fail) { if (array_diff(explode(',', (string) $value), Discussion::COMMENT_TYPES) !== []) { $fail(__('validation.in', ['attribute' => $attribute])); } }], 'status' => ['sometimes', 'string', Rule::in(Discussion::STATUSES)], // 逗号分隔多选,如 error,warning 'severity' => ['sometimes', 'string', 'regex:/^[a-z]+(,[a-z]+)*$/'], 'page' => ['integer', 'min:1'], 'per_page' => ['integer', 'min:1', 'max:200'], ]; } }