From 54f1f9b3ac597883ed4d1c60c759f0000503930e Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 27 Feb 2025 10:10:05 +0000 Subject: [PATCH] Improve validation message when handle starts with a number --- resources/lang/en/validation.php | 1 + src/Rules/Handle.php | 5 +++++ tests/Rules/HandleTest.php | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index 3b15c72b0a..bd70f18372 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -156,6 +156,7 @@ 'arr_fieldtype' => 'This is invalid.', 'handle' => 'Must contain only lowercase letters and numbers with underscores as separators.', + 'handle_starts_with_number' => 'Cannot start with a number.', 'slug' => 'Must contain only letters and numbers with dashes or underscores as separators.', 'code_fieldtype_rulers' => 'This is invalid.', 'composer_package' => 'Must be a valid composer package name (eg. hasselhoff/kung-fury).', diff --git a/src/Rules/Handle.php b/src/Rules/Handle.php index 9a3c06514f..29b7fdd96c 100644 --- a/src/Rules/Handle.php +++ b/src/Rules/Handle.php @@ -4,11 +4,16 @@ use Closure; use Illuminate\Contracts\Validation\ValidationRule; +use Illuminate\Support\Str; class Handle implements ValidationRule { public function validate(string $attribute, mixed $value, Closure $fail): void { + if (Str::startsWith($value, range(0, 9))) { + $fail('statamic::validation.handle_starts_with_number')->translate(); + } + if (! preg_match('/^[a-zA-Z][a-zA-Z0-9]*(?:_{0,1}[a-zA-Z0-9])*$/', $value)) { $fail('statamic::validation.handle')->translate(); } diff --git a/tests/Rules/HandleTest.php b/tests/Rules/HandleTest.php index 1802979704..f0da57878d 100644 --- a/tests/Rules/HandleTest.php +++ b/tests/Rules/HandleTest.php @@ -43,4 +43,10 @@ public function it_outputs_helpful_validation_error() { $this->assertValidationErrorOutput(trans('statamic::validation.handle'), '_bad_input'); } + + #[Test] + public function it_outputs_helpful_validation_error_when_string_starts_with_number() + { + $this->assertValidationErrorOutput(trans('statamic::validation.handle_starts_with_number'), '1bad_input'); + } }