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' => ['sometimes', 'required', new LocaleRequiredTranslatable(maxLength: 100)], 'description' => ['nullable', new TranslatableField(maxLength: 500)], 'is_active' => 'sometimes|boolean', 'permissions' => 'nullable|array', 'permissions.*.id' => ['required', 'integer', Rule::exists(Permission::class, 'id')], 'permissions.*.scope_type' => ['nullable', Rule::enum(ScopeType::class)], ]; // 모듈/플러그인이 validation rules를 동적으로 추가할 수 있도록 훅 제공 return HookManager::applyFilters('core.role.update_validation_rules', $rules, $this); } /** * 검증 오류 메시지 커스터마이징 * * @return array */ public function messages(): array { return [ 'name.required' => __('role.validation.name_required'), 'permissions.array' => __('role.validation.permission_ids_array'), 'permissions.*.id.exists' => __('role.validation.permission_ids_exists'), 'permissions.*.id.integer' => __('role.validation.permission_ids_integer'), ]; } }