|string> */ public function rules(): array { return [ 'parent_id' => 'nullable|exists:menus,id', 'name' => 'required|string|max:100', 'url' => 'nullable|string|max:255', 'icon' => 'nullable|string|max:100', 'sort_order' => 'nullable|integer|min:0', 'is_active' => 'nullable|boolean', 'hidden' => 'nullable|boolean', 'is_external' => 'nullable|boolean', 'external_url' => 'nullable|string|max:255|required_if:is_external,1', 'options' => 'nullable|array', 'options.section' => 'nullable|string|in:main,tools,labs', 'options.meta' => 'nullable|array', ]; } /** * Get custom attributes for validator errors. * * @return array */ public function attributes(): array { return [ 'parent_id' => '부모 메뉴', 'name' => '메뉴명', 'url' => 'URL', 'icon' => '아이콘', 'sort_order' => '정렬 순서', 'is_active' => '활성 상태', 'hidden' => '숨김 여부', 'is_external' => '외부 링크', 'external_url' => '외부 URL', ]; } /** * Get custom messages for validator errors. * * @return array */ public function messages(): array { return [ 'parent_id.exists' => '존재하지 않는 부모 메뉴입니다.', 'external_url.required_if' => '외부 링크 사용 시 외부 URL은 필수입니다.', ]; } }