> */ trait ProvidesPressReleaseFormRules { /** * @return array> */ protected function baseFormRules(): array { $rules = [ 'language' => ['required', Rule::in(['de', 'en'])], 'categoryId' => ['required', 'integer', Rule::exists('categories', 'id')], 'contactId' => ['nullable', 'integer'], 'title' => ['required', 'string', 'min:5', 'max:255'], 'subtitle' => ['nullable', 'string', 'max:255'], 'text' => ['required', 'string', 'min:50'], 'keywords' => ['nullable', 'string', 'max:255'], 'backlinkUrl' => ['nullable', 'url', 'max:255'], 'boilerplateOverride' => ['nullable', 'string', 'max:5000'], 'publishMode' => ['required', Rule::in(['now', 'scheduled'])], ]; // Termin-Pflicht nur, wenn der User explizit Scheduling gewählt hat. // Min. 5 Minuten in der Zukunft, damit der Background-Job (alle 5 Min) // die PM verlässlich rechtzeitig fängt. if ($this->publishMode === 'scheduled') { $rules['scheduledDate'] = ['required', 'date']; $rules['scheduledTime'] = ['required', 'date_format:H:i']; $rules['scheduledAt'] = [ 'required', 'date', // Termin wird in Europe/Berlin erfasst; deshalb hier zeitzonen- // bewusst prüfen statt über die naive `after:`-Regel. function (string $attribute, mixed $value, Closure $fail): void { $scheduledAt = $this->resolveScheduledAt(); if ($scheduledAt === null || $scheduledAt->lessThanOrEqualTo(now()->addMinutes(5))) { $fail(__('Der Veröffentlichungstermin muss mindestens 5 Minuten in der Zukunft liegen.')); } }, ]; } else { $rules['scheduledDate'] = ['nullable']; $rules['scheduledTime'] = ['nullable']; $rules['scheduledAt'] = ['nullable']; } $rules['embargoAt'] = ['nullable']; return $rules; } }