input('content'); if (is_string($content)) { $decoded = json_decode($content, true); if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { $this->merge(['content' => $decoded]); } } } /** * 요청에 적용할 검증 규칙 * * preview_layout: 미리보기에 사용할 대표 레이아웃명. * - overlay 타입은 target_layout 자체가 대표 레이아웃이므로 생략 가능. * - extension_point 타입은 프론트가 선택한 레이아웃명을 전달. * * @return array|string> */ public function rules(): array { $rules = [ 'content' => ['required', 'array'], 'preview_layout' => ['nullable', 'string', 'max:255'], ]; // 모듈/플러그인이 validation rules를 동적으로 추가할 수 있도록 훅 제공 return HookManager::applyFilters('core.layout_extension.store_preview_validation_rules', $rules, $this); } /** * 검증 오류 메시지 커스터마이징 * * @return array */ public function messages(): array { return [ 'content.required' => __('validation.layout_extension.content.required'), 'content.array' => __('validation.layout_extension.content.array'), 'preview_layout.string' => __('validation.layout_extension.preview_layout.string'), 'preview_layout.max' => __('validation.layout_extension.preview_layout.max'), ]; } }