feat: E.164 phone validation and storage with libphonenumber
- Add giggsey/libphonenumber-for-php, PhoneNumberNormalizer, ValidPhoneNumber rule - Store subscribers as E.164; mutator normalizes on save; optional phone required from form block - Migration to normalize legacy subscriber phones; Mailwizz/search/UI/tests updated - Add run-deploy-from-local.sh and PREREGISTER_DEFAULT_PHONE_REGION in .env.example Made-with: Cursor
This commit is contained in:
@@ -5,7 +5,10 @@ declare(strict_types=1);
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use App\Models\PreregistrationPage;
|
||||
use App\Rules\ValidPhoneNumber;
|
||||
use App\Services\PhoneNumberNormalizer;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Validation\Rules\Email;
|
||||
|
||||
class SubscribePublicPageRequest extends FormRequest
|
||||
@@ -28,13 +31,23 @@ class SubscribePublicPageRequest extends FormRequest
|
||||
->rfcCompliant()
|
||||
->preventSpoofing();
|
||||
|
||||
$phoneRules = ['nullable', 'string', 'max:255'];
|
||||
|
||||
if ($page->isPhoneFieldEnabledForSubscribers()) {
|
||||
$phoneRules = [
|
||||
Rule::requiredIf(fn (): bool => $page->isPhoneFieldRequiredForSubscribers()),
|
||||
'nullable',
|
||||
'string',
|
||||
'max:32',
|
||||
new ValidPhoneNumber(app(PhoneNumberNormalizer::class)),
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'first_name' => ['required', 'string', 'max:255'],
|
||||
'last_name' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'string', 'max:255', $emailRule],
|
||||
'phone' => $page->isPhoneFieldEnabledForSubscribers()
|
||||
? ['nullable', 'string', 'regex:/^[0-9]{8,15}$/']
|
||||
: ['nullable', 'string', 'max:255'],
|
||||
'phone' => $phoneRules,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -45,7 +58,6 @@ class SubscribePublicPageRequest extends FormRequest
|
||||
{
|
||||
return [
|
||||
'email' => __('Please enter a valid email address.'),
|
||||
'phone.regex' => __('Please enter a valid phone number (8–15 digits).'),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -73,15 +85,22 @@ class SubscribePublicPageRequest extends FormRequest
|
||||
|
||||
/** @var PreregistrationPage $page */
|
||||
$page = $this->route('publicPage');
|
||||
$phone = $this->input('phone');
|
||||
if (! $page->isPhoneFieldEnabledForSubscribers()) {
|
||||
$this->merge(['phone' => null]);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$phone = $this->input('phone');
|
||||
if ($phone === null || $phone === '') {
|
||||
$this->merge(['phone' => null]);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_string($phone)) {
|
||||
$digits = preg_replace('/\D+/', '', $phone);
|
||||
$this->merge(['phone' => $digits === '' ? null : $digits]);
|
||||
$trimmed = trim($phone);
|
||||
$this->merge(['phone' => $trimmed === '' ? null : $trimmed]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user