has('name') && is_string($this->name)) { $nameArray = []; foreach ($locales as $locale) { $nameArray[$locale] = $this->name; } $this->merge(['name' => $nameArray]); } // description이 문자열로 들어온 경우 배열로 변환 if ($this->has('description') && is_string($this->description)) { $descriptionArray = []; foreach ($locales as $locale) { $descriptionArray[$locale] = $this->description; } $this->merge(['description' => $descriptionArray]); } } /** * 요청에 적용할 검증 규칙 * * @return array|string> */ public function rules(): array { $rules = [ 'name' => ['nullable', new TranslatableField(maxLength: 255)], 'description' => ['nullable', new TranslatableField(maxLength: 1000)], 'status' => ['nullable', 'string', Rule::in(ExtensionStatus::values())], ]; // 모듈/플러그인이 validation rules를 동적으로 추가할 수 있도록 훅 제공 return HookManager::applyFilters('core.module.update_validation_rules', $rules, $this); } /** * 검증 오류 메시지 커스터마이징 */ public function messages(): array { return [ 'status.in' => __('validation.module.status.in'), ]; } }