['required', 'string', 'max:255'], 'descripcion' => ['required', 'string', 'max:5000'], 'precio' => ['required', 'numeric', 'min:0', 'regex:/^\d+(\.\d{1,2})?$/'], 'imagen' => ['nullable', 'image', 'mimes:jpeg,png,gif,webp', 'max:10240'], 'categoria' => ['required', 'string', 'max:100'], 'destacado' => ['nullable', 'boolean'], 'activo' => ['nullable', 'boolean'], 'orden' => ['nullable', 'integer', 'min:0'], ]; // En actualización, imagen no es obligatoria if ($this->isMethod('PATCH') || $this->isMethod('PUT')) { $rules['imagen'] = ['nullable', 'image', 'mimes:jpeg,png,gif,webp', 'max:10240']; } return $rules; } public function messages(): array { return [ 'nombre.required' => 'El nombre es obligatorio.', 'nombre.max' => 'El nombre no puede exceder 255 caracteres.', 'descripcion.required' => 'La descripción es obligatoria.', 'descripcion.max' => 'La descripción no puede exceder 5000 caracteres.', 'precio.required' => 'El precio es obligatorio.', 'precio.numeric' => 'El precio debe ser un número válido.', 'precio.min' => 'El precio no puede ser negativo.', 'precio.regex' => 'El precio debe tener como máximo 2 decimales.', 'imagen.image' => 'La imagen debe ser un archivo de imagen.', 'imagen.mimes' => 'El formato de imagen no es válido.', 'imagen.max' => 'La imagen no puede exceder 10MB.', 'categoria.required' => 'La categoría es obligatoria.', 'categoria.max' => 'La categoría no puede exceder 100 caracteres.', 'orden.integer' => 'El orden debe ser un número entero.', 'orden.min' => 'El orden no puede ser negativo.', ]; } }