[ 'required', 'string', 'min:3', 'max:1000', ], 'category_id' => [ 'nullable', 'integer', 'exists:categories,id', ], 'session_token' => [ 'nullable', 'string', 'max:64', ], ]; } public function messages(): array { return [ 'question.required' => 'Soalan wajib diisi.', 'question.min' => 'Soalan terlalu pendek (minimum 3 karakter).', 'question.max' => 'Soalan terlalu panjang (maksimum 1000 karakter).', 'category_id.exists' => 'Kategori tidak wujud.', ]; } /** * Sanitize soalan sebelum diproses. */ protected function prepareForValidation(): void { if ($this->has('question')) { // Buang karakter kawalan berbahaya yang mungkin prompt injection $sanitized = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $this->question); $sanitized = trim($sanitized); $this->merge(['question' => $sanitized]); } } }