Skip to content

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;
});

Reference