*/ public static function rules(bool $hosted): array { return [ 'media' => ['sometimes', 'array'], 'media.*.id' => $hosted ? ['required', 'string'] : ['sometimes', 'nullable', 'string'], 'media.*.path' => $hosted ? ['required', 'string', 'max:500'] : ['sometimes', 'nullable', 'string', 'max:500'], 'media.*.url' => $hosted ? ['required', 'string', 'max:2048'] : ['required', 'string', 'max:2048', 'url:http,https'], 'media.*.type' => ['sometimes', 'nullable', 'string', 'max:32'], 'media.*.mime_type' => ['sometimes', 'nullable', 'string', 'max:255'], 'media.*.original_filename' => ['sometimes', 'nullable', 'string', 'max:500'], 'media.*.size' => ['sometimes', 'nullable', 'integer'], 'media.*.meta' => ['sometimes', 'nullable', 'array', static function (string $attribute, mixed $value, Closure $fail): void { $altText = data_get($value, 'alt_text'); if ($altText === null) { return; } if (! is_string($altText)) { $fail('validation.string')->translate(['attribute' => trans('posts.edit.alt_text.label')]); return; } if (mb_strlen($altText) > self::ALT_TEXT_MAX_LENGTH) { $fail('validation.max.string')->translate(['attribute' => trans('posts.edit.alt_text.label'), 'max' => self::ALT_TEXT_MAX_LENGTH]); } }], 'media.*.source' => ['sometimes', 'nullable', 'string', Rule::in(array_column(Source::cases(), 'value'))], 'media.*.source_meta' => ['sometimes', 'nullable', 'array'], ]; } }