44 lines
1.2 KiB
PHP
44 lines
1.2 KiB
PHP
<?php
|
|
|
|
namespace Modules\Countries\Rules;
|
|
|
|
use Closure;
|
|
use Illuminate\Contracts\Validation\ValidationRule;
|
|
use Modules\Countries\Models\Country;
|
|
|
|
class ValidIso3166CountryCode implements ValidationRule
|
|
{
|
|
public function __construct(
|
|
private readonly bool $activeOnly = true,
|
|
private readonly string $format = 'alpha2',
|
|
) {}
|
|
|
|
public function validate(string $attribute, mixed $value, Closure $fail): void
|
|
{
|
|
if (! is_string($value) && ! is_int($value)) {
|
|
$fail('The :attribute must be a valid ISO 3166 country code.');
|
|
|
|
return;
|
|
}
|
|
|
|
$code = strtoupper(trim((string) $value));
|
|
$query = Country::query();
|
|
|
|
match ($this->format) {
|
|
'alpha2' => $query->where('alpha2', $code),
|
|
'alpha3' => $query->where('alpha3', $code),
|
|
'numeric' => $query->where('numeric', str_pad($code, 3, '0', STR_PAD_LEFT)),
|
|
'any' => $query->forIsoCode($code),
|
|
default => $query->whereRaw('1 = 0'),
|
|
};
|
|
|
|
if ($this->activeOnly) {
|
|
$query->where('is_active', true);
|
|
}
|
|
|
|
if (! $query->exists()) {
|
|
$fail('The :attribute must be a supported ISO 3166 country code.');
|
|
}
|
|
}
|
|
}
|