Pravidlo phoneE164 – Validace telefonních čísel
Vestavěné pravidlo pro ověřování mezinárodních telefonních čísel v E.164 formátu.
Přehled
Pravidlo phoneE164 validuje telefonní čísla pomocí Google knihovny libphonenumber. Zajišťuje:
- Validní E.164 formát (mezinárodní standard)
- Správný kód země
- Reálný formát (knihovna ověří)
Instalace
Knihovna libphonenumber-for-php je již součástí composer.json. Již instalovaná.
Použití
Helper funkce
use function Petrovo\Validation\validation;
$error = validation('phone', '+420777123456', 'required|phoneE164');
if ($error === false) {
echo "Telefon je validní";
} else {
echo "Chyba: " . $error;
}
Validator třída
use Petrovo\Validation\Validator;
$validator = new Validator([
'phone' => 'Telefonní číslo není validní',
]);
$validation = $validator->make($_POST, [
'phone' => 'required|phoneE164',
]);
$validation->validate();
if ($validation->fails()) {
$errors = $validation->errors();
echo $errors->first('phone'); // "Telefonní číslo není validní"
}
E.164 Formát
Mezinárodní standard ITU-T pro telefonní čísla.
Syntax:
+[country-code][number]
Charakteristiky:
- Začíná +
- Maximálně 15 číslic
- Bez mezer, pomlček, závorek
- Globálně jedinečné
Příklady Validních Formátů
// Česká republika
+420777123456
+420222123456
// USA
+12015550123
+14155552671
// Německo
+491234567890
+49301234567
// Francie
+33123456789
+33678901234
// Velká Británie
+441632960123
+447911123456
Příklady Nevalidních Formátů
// Bez plus
420777123456
// Místní číslo bez kódu země
777123456
// Neexistující kód země
+999777123456
// S mezerami/pomlčkami (E.164 to neumožňuje)
+420 777 123 456
+420-777-123-456
+1 (201) 555-0123
// Moc krátké
+1234
// Moc dlouhé
+12015550123456789
Implementace
Pravidlo je implementováno v Validator.php:
private function rulePhoneE164(mixed $value): bool
{
if ($value === null || $value === '') {
return false;
}
$phoneUtil = PhoneNumberUtil::getInstance();
try {
$phoneNumber = $phoneUtil->parse($value, null);
return $phoneUtil->isValidNumber($phoneNumber);
} catch (NumberParseException) {
return false;
}
}
Logika:
1. Pokud null/prázdné → false (invalid)
2. Parse číslo (neznámá země = null)
3. Ověř jestli je validní
4. Catch ParseException → false
Kombinace s Jinými Pravidly
Povinné (required)
'phone' => 'required|phoneE164'
Telefon je povinný a musí být E.164.
Volitelné (nullable)
'phone' => 'nullable|phoneE164'
Telefon je volitelný. Pokud vyplní, musí být E.164.
S Dalšími Pravidly
'phone' => 'required|string|phoneE164'
Praktické Příklady
Registrace uživatele
use Petrovo\Validation\Validator;
$validator = new Validator([
'email' => 'Email je povinný',
'phone' => 'Telefonní číslo musí být validní (např. +420777123456)',
]);
$validation = $validator->make($_POST, [
'email' => 'required|email',
'phone' => 'nullable|phoneE164', // Volitelné
]);
$validation->validate();
if ($validation->fails()) {
return json_response($validation->errors()->firstOfAll(), 422);
}
// Registruj uživatele
saveUser($_POST['email'], $_POST['phone'] ?? null);
Objednávka s doručením
$validator = new Validator([
'contact_phone' => 'Telefonní číslo pro doručení je neplatné',
]);
$validation = $validator->make($_POST, [
'contact_phone' => 'required|phoneE164',
]);
$validation->validate();
if ($validation->fails()) {
return errorResponse('Kontaktní telefon není validní');
}
// Vytvoř objednávku
API endpoint
// app/DATA/Orders/create.php
$_post['contact_phone'] = $_post['contact_phone'] ?? '';
$error = validation('contact_phone', $_post['contact_phone'], 'required|phoneE164');
if ($error !== false) {
return outputJson(['error' => $error], 400);
}
// Pokračuj s vytvořením objednávky
$orderId = DB::insert('orders', [
'contact_phone' => $_post['contact_phone'],
// ...
]);
return outputJson(['success' => true, 'order_id' => $orderId]);
Poznámky
Poznámka 1: Prázdné hodnoty
validation('phone', '', 'required|phoneE164');
// → false (prázdné je invalid)
validation('phone', null, 'required|phoneE164');
// → false (null je invalid)
Pokud chceš volitelné pole:
validation('phone', '', 'nullable|phoneE164');
// → false (OK – prázdné je allowed)
validation('phone', '+420777123456', 'nullable|phoneE164');
// → false (OK – validní E.164)
Poznámka 2: Kód země
Pravidlo automaticky rozpozná kód země z čísla:
// Česká republika (420)
+420777123456
// USA (1)
+12015550123
// Německo (49)
+491234567890
Není potřeba specifikovat zemí – libphonenumber ji z čísla pozná.
Poznámka 3: Performance
libphonenumber je pomalejší než jednoduchá pravidla (email, required). Pokud validuješ tisíce čísel:
// V cyklu – cache se nepoužívá
foreach ($phones as $phone) {
validation('phone', $phone, 'phoneE164'); // Pokaždé parser
}
// Optimální: Batch cache
$validated = array_filter($phones, function($p) {
return validation('phone', $p, 'phoneE164') === false;
});