'required|exists:admin_pm_projects,id', 'task_id' => 'nullable|exists:admin_pm_tasks,id', 'title' => 'required|string|max:255', 'description' => 'nullable|string|max:5000', 'type' => 'nullable|in:'.implode(',', array_keys(AdminPmIssue::getTypes())), 'status' => 'nullable|in:'.implode(',', array_keys(AdminPmIssue::getStatuses())), ]; } /** * Get custom attributes for validator errors. */ public function attributes(): array { return [ 'project_id' => '프로젝트', 'task_id' => '연결된 작업', 'title' => '이슈 제목', 'description' => '이슈 설명', 'type' => '타입', 'status' => '상태', ]; } /** * Get the error messages for the defined validation rules. */ public function messages(): array { return [ 'project_id.required' => '프로젝트를 선택해주세요.', 'project_id.exists' => '존재하지 않는 프로젝트입니다.', 'task_id.exists' => '존재하지 않는 작업입니다.', 'title.required' => '이슈 제목은 필수입니다.', 'title.max' => '이슈 제목은 최대 255자까지 입력 가능합니다.', 'description.max' => '이슈 설명은 최대 5000자까지 입력 가능합니다.', 'type.in' => '올바른 타입을 선택해주세요.', 'status.in' => '올바른 상태를 선택해주세요.', ]; } /** * Prepare the data for validation. */ protected function prepareForValidation(): void { // 기본값 설정 if (! $this->has('type')) { $this->merge(['type' => AdminPmIssue::TYPE_BUG]); } if (! $this->has('status')) { $this->merge(['status' => AdminPmIssue::STATUS_OPEN]); } } }