bytes4sale/phone-number-info
Laravel package for validating phone numbers and querying hlrlookup.com for HLR insights: number type, real-time status, original network, porting info, SMS/MMS email addresses, plus request parameters and credit usage tracking.
Installation
composer require bytes4sale/phone-number-info
Publish the config file (if needed):
php artisan vendor:publish --provider="Bytes4Sale\PhoneNumberInfo\PhoneNumberInfoServiceProvider"
Basic Usage Fetch carrier info for a phone number:
use Bytes4Sale\PhoneNumberInfo\Facades\PhoneNumberInfo;
$carrier = PhoneNumberInfo::getCarrier('+1234567890');
dd($carrier);
First Use Case Validate a phone number and display its carrier:
$number = '+1234567890';
$info = PhoneNumberInfo::getInfo($number);
if ($info->isValid()) {
echo "Carrier: " . $info->carrier;
echo "Country: " . $info->country;
} else {
echo "Invalid phone number";
}
User Registration/Verification
// Validate and store user phone with carrier info
$phoneInfo = PhoneNumberInfo::getInfo(request('phone'));
if ($phoneInfo->isValid()) {
User::create([
'phone' => request('phone'),
'carrier' => $phoneInfo->carrier,
'country' => $phoneInfo->country,
]);
}
Fraud Detection
// Check for high-risk carriers (e.g., prepaid/SIM-only)
$carrier = PhoneNumberInfo::getCarrier($user->phone);
if (str_contains(strtolower($carrier), ['prepaid', 'sim'])) {
event(new SuspiciousPhoneDetected($user));
}
Localization
// Route users based on phone country
$country = PhoneNumberInfo::getCountry($request->phone);
return redirect()->route("localized.dashboard.$country");
$carrier = Cache::remember("phone_carrier_{$phone}", now()->addHours(1), function() use ($phone) {
return PhoneNumberInfo::getCarrier($phone);
});
PhoneNumberInfo::getHLRInfo($phone)->onQueue('hlr-queue');
public static function label()
{
return 'Carrier';
}
public function value(User $user)
{
return PhoneNumberInfo::getCarrier($user->phone) ?: 'Unknown';
}
Rate Limiting
try {
$info = PhoneNumberInfo::getInfo($phone);
} catch (RateLimitExceededException $e) {
sleep(2 ** $e->retryAfter);
retry();
}
Number Formatting
+<country><number>). Normalize inputs:
use libphonenumber\PhoneNumberUtil;
$phone = PhoneNumberUtil::getInstance()->format($rawInput, PhoneNumberFormat::E164);
HLR Data Limitations
null responses gracefully:
$hlr = PhoneNumberInfo::getHLRInfo($phone);
if (!$hlr->isActive()) {
// Fallback logic (e.g., SMS verification)
}
Enable Logging
Add to config/phone-number-info.php:
'debug' => env('APP_DEBUG', false),
Logs will appear in storage/logs/laravel.log.
Mock Responses for Testing
// In tests, stub the facade:
PhoneNumberInfo::shouldReceive('getCarrier')
->once()
->andReturn('Test Carrier');
Custom Data Sources
Override the default provider in config/phone-number-info.php:
'provider' => Bytes4Sale\PhoneNumberInfo\Providers\CustomProvider::class,
Add Metadata Fields
Extend the PhoneNumberInfo model:
namespace App\Extensions;
use Bytes4Sale\PhoneNumberInfo\Models\PhoneNumberInfo as BaseInfo;
class ExtendedPhoneNumberInfo extends BaseInfo {
public function getRiskScore(): float {
// Custom logic
}
}
Webhook Integration Listen for carrier updates:
PhoneNumberInfo::listen(function ($event) {
// Handle real-time updates (e.g., number porting)
});
API Keys
Set your API key in .env:
PHONE_NUMBER_INFO_API_KEY=your_key_here
Or via config:
'api_key' => env('PHONE_NUMBER_INFO_API_KEY'),
Fallback Providers Define a chain of providers in config:
'providers' => [
Bytes4Sale\PhoneNumberInfo\Providers\PrimaryProvider::class,
Bytes4Sale\PhoneNumberInfo\Providers\FallbackProvider::class,
],
How can I help you explore Laravel packages today?