*/ public function rules(): array { $page = $this->route('page'); $creating = ! $page instanceof Page; $sometimes = $creating ? 'required' : 'sometimes'; return [ 'title' => [$sometimes, new Translatable(requireDefaultLocale: $creating, max: 255)], 'slug' => [ $sometimes, new Translatable(requireDefaultLocale: $creating, max: 255), new UniqueTranslatedSlug(Page::class, $page?->id), ], 'excerpt' => ['sometimes', 'nullable', new Translatable(max: 500)], 'body' => ['sometimes', 'nullable', new Translatable], 'meta_title' => ['sometimes', 'nullable', new Translatable(max: 60)], 'meta_description' => ['sometimes', 'nullable', new Translatable(max: 160)], 'category_id' => ['sometimes', 'nullable', 'integer', Rule::exists('categories', 'id')->whereNull('deleted_at')], 'status' => ['sometimes', Rule::enum(PageStatus::class)], 'featured_image' => ['sometimes', 'nullable', 'string', 'max:2048'], 'featured_image_alt' => ['sometimes', 'nullable', new Translatable(max: 255)], 'is_featured' => ['sometimes', 'boolean'], 'published_at' => ['sometimes', 'nullable', 'date'], 'unpublish_at' => ['sometimes', 'nullable', 'date', 'after:published_at'], ]; } public function withValidator(Validator $validator): void { $validator->after(function (Validator $validator): void { // Publishing is a distinct permission from editing, so a caller // who may write content still cannot push it live on their own. $status = $this->input('status'); if ($status === PageStatus::Published->value && $this->user()?->cannot('pages.publish')) { $validator->errors()->add('status', __('rules.pages.cannot_publish')); } }); } }