|string> */ public function rules(): array { $rules = [ 'plugin_name' => ['required', 'string', 'max:255', new ValidExtensionIdentifier], 'vendor_mode' => ['nullable', 'string', 'in:auto,composer,bundled'], // cascade 동반 설치 — install-preview 응답을 바탕으로 사용자가 선택한 항목 'dependencies' => ['nullable', 'array'], 'dependencies.*.type' => ['required_with:dependencies', 'string', 'in:module,plugin'], 'dependencies.*.identifier' => ['required_with:dependencies', 'string', 'max:255'], 'language_packs' => ['nullable', 'array'], 'language_packs.*' => ['string', 'max:255'], ]; // 모듈/플러그인이 validation rules를 동적으로 추가할 수 있도록 훅 제공 return HookManager::applyFilters('core.plugin.install_validation_rules', $rules, $this); } /** * 검증 오류 메시지 커스터마이징 * * @return array */ public function messages(): array { return [ 'plugin_name.required' => __('plugins.validation.plugin_name_required'), 'plugin_name.string' => __('plugins.validation.plugin_name_string'), 'plugin_name.max' => __('plugins.validation.plugin_name_max', ['max' => 255]), ]; } }