'required|string|max:255', 'description' => 'nullable|string', 'price' => 'required|numeric|min:0', 'image' => 'nullable|file|mimes:jpeg,jpg,png,gif,webp|max:2048', 'barcode' => 'nullable|string|max:255', 'ingredients' => 'nullable|string', 'allergens' => 'nullable|string', 'net_weight' => 'nullable|numeric|min:0', 'origin_country' => 'nullable|string|max:255', 'manufacturer' => 'nullable|string|max:255', 'distributor' => 'nullable|string|max:255', 'energy_kj' => 'nullable|numeric|min:0', 'energy_kcal' => 'nullable|numeric|min:0', 'fat' => 'nullable|numeric|min:0', 'saturated_fat' => 'nullable|numeric|min:0', 'carbohydrates' => 'nullable|numeric|min:0', 'sugar' => 'nullable|numeric|min:0', 'protein' => 'nullable|numeric|min:0', 'salt' => 'nullable|numeric|min:0', 'storage_instructions' => 'nullable|string', 'usage_instructions' => 'nullable|string', 'best_before_date' => 'nullable|date', 'lot_number' => 'nullable|string|max:255', ]; } /** * Get custom validation messages. */ public function messages(): array { return [ 'name.required' => 'Der Produktname ist erforderlich.', 'name.max' => 'Der Produktname darf maximal :max Zeichen lang sein.', 'price.required' => 'Der Preis ist erforderlich.', 'price.numeric' => 'Der Preis muss eine Zahl sein.', 'price.min' => 'Der Preis muss mindestens :min sein.', 'image.file' => 'Das Bild muss eine gültige Datei sein.', 'image.mimes' => 'Das Bild muss vom Typ JPEG, JPG, PNG, GIF oder WebP sein.', 'image.max' => 'Das Bild darf maximal :max KB groß sein.', 'energy_kj.numeric' => 'Der Energiegehalt (kJ) muss eine Zahl sein.', 'energy_kcal.numeric' => 'Der Energiegehalt (kcal) muss eine Zahl sein.', 'fat.numeric' => 'Der Fettgehalt muss eine Zahl sein.', 'saturated_fat.numeric' => 'Der Gehalt an gesättigten Fettsäuren muss eine Zahl sein.', 'carbohydrates.numeric' => 'Der Kohlenhydratgehalt muss eine Zahl sein.', 'sugar.numeric' => 'Der Zuckergehalt muss eine Zahl sein.', 'protein.numeric' => 'Der Proteingehalt muss eine Zahl sein.', 'salt.numeric' => 'Der Salzgehalt muss eine Zahl sein.', 'net_weight.numeric' => 'Das Nettogewicht muss eine Zahl sein.', 'best_before_date.date' => 'Das Mindesthaltbarkeitsdatum muss ein gültiges Datum sein.', ]; } /** * Configure the validator instance. */ public function withValidator($validator) { $validator->after(function ($validator) { if ($this->hasFile('image')) { $file = $this->file('image'); $mimeType = $file->getMimeType(); // Explizite WebP-Überprüfung if ($mimeType === 'image/webp' || $file->getClientOriginalExtension() === 'webp') { // WebP ist erlaubt return; } // Standard-Bildtypen prüfen $allowedMimes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif']; if (!in_array($mimeType, $allowedMimes)) { $validator->errors()->add('image', 'Das Bildformat wird nicht unterstützt. Erlaubt sind: JPEG, PNG, GIF, WebP.'); } } }); } }