Installation:
composer require stojankukrika/laravel-tel-input
npm install intl-tel-input --save
Publish assets and config:
php artisan vendor:publish --provider="Stojankukrika\LaravelTelInput\TelInputServiceProvider" --tag="tel-input-config"
npm run dev
First Use Case: Add the directive to a Blade form:
<x-tel-input name="phone" id="phone" />
This renders a phone input with default country (US) and auto-formatting.
Livewire Integration: For Livewire 3, use the component:
<livewire:tel-input name="phone" wire:model="phoneNumber" />
Basic Form Handling:
<form method="POST" action="/submit">
@csrf
<x-tel-input name="phone" id="phone" required />
<button type="submit">Submit</button>
</form>
required|phone:US).Custom Countries:
<x-tel-input
name="phone"
id="phone"
defaultCountry="GB"
separateDialCode="true"
/>
Livewire 2/3:
// Livewire Component
public $phoneNumber;
public function mount() {
$this->phoneNumber = null;
}
public function rules() {
return ['phoneNumber' => 'required|phone:GB'];
}
<!-- Blade View -->
<livewire:tel-input
name="phoneNumber"
wire:model="phoneNumber"
defaultCountry="GB"
/>
Dynamic Country Sync:
// Livewire Component
public $countryCode;
public function updatedCountryCode($value) {
$this->emit('telInputUpdateCountry', $value);
}
<livewire:tel-input
name="phoneNumber"
wire:model="phoneNumber"
wire:ignore
@this.countrysync="this.countryCode = $event.target.value"
/>
$validated = $request->validate([
'phone' => 'required|phone:US,CA,GB',
]);
phone:US).app/Providers/AppServiceProvider:
use Stojankukrika\LaravelTelInput\Rules\Phone;
Validator::extend('phone', function ($attribute, $value, $parameters, $validator) {
return (new Phone($parameters))->validate($value);
});
Asset Loading:
intl-tel-input CSS/JS are included. Run npm run dev after installation.// resources/js/app.js
import 'intl-tel-input/build/js/intlTelInput';
Livewire 2 vs. 3:
wire:model.defer for async updates:
<livewire:tel-input wire:model.defer="phoneNumber" />
wire:ignore for dynamic updates:
<livewire:tel-input wire:ignore @this.countrysync="..." />
Validation Quirks:
Phone rule:
// app/Rules/CustomPhone.php
use Stojankukrika\LaravelTelInput\Rules\Phone as BasePhone;
class CustomPhone extends BasePhone {
public function validate($attribute, $value) {
return preg_match('/^\+1\d{10}$/', $value); // Example: US-only
}
}
Console Errors:
intl-tel-input assets or conflicts with other JS libraries (e.g., jQuery).php artisan view:clear.Country Data:
config/tel-input.php):
'countries' => ['US', 'GB', 'DE'], // Whitelist
'excludeCountries' => ['FR'], // Blacklist
Custom Templates:
Override Blade directives in resources/views/vendor/tel-input:
<!-- resources/views/vendor/tel-input/input.blade.php -->
<input type="tel" class="custom-phone-input" wire:model.defer="{{ $name }}">
API Integration: Use the underlying JS plugin directly for non-Laravel frontend logic:
const input = document.querySelector('#phone');
const iti = window.intlTelInput(input, {
initialCountry: 'auto',
geoIpLookup: function(callback) {
fetch('/api/country')
.then(res => res.json())
.then(data => callback(data.countryCode));
}
});
Testing: Mock the component in PHPUnit:
$this->view->composer('*', function ($view) {
$view->with('telInputConfig', ['defaultCountry' => 'US']);
});
How can I help you explore Laravel packages today?