devrabiul/laravel-geo-genius
Laravel GeoGenius adds IP-based geolocation, automatic timezone detection/conversion, locale detection with translation and number conversion, plus a country picker and phone formatting/validation. Works with Livewire and supports cookies or headers.
composer require devrabiul/laravel-geo-genius
php artisan vendor:publish --provider="Devrabiul\LaravelGeoGenius\LaravelGeoGeniusServiceProvider"
php artisan migrate
// In a controller or service
$geoData = laravelGeoGenius()->geo()->locateVisitor();
dd($geoData); // Returns array with country, timezone, IP, etc.
<!DOCTYPE html>
<html>
<head>
{!! laravelGeoGenius()->initIntlPhoneInput() !!}
</head>
<body>
<input type="tel" id="phone" name="phone">
</body>
</html>
$convertedTime = laravelGeoGenius()->timezone()->convertToUserTimezone('2024-01-01 12:00:00');
$geoData = laravelGeoGenius()->geo()->locateVisitor();
$geoData = laravelGeoGenius()->geo()->getLocationData();
$geoData = laravelGeoGenius()->geo()->getLocationData([
'fallback' => [
'country' => 'us',
'timezone' => 'America/New_York'
]
]);
// In Livewire component
public function mount() {
$this->geoData = laravelGeoGenius()->geo()->getLocationData();
}
public function updatedGeoData() {
// React to changes (e.g., user manually selects country)
laravelGeoGenius()->geo()->updateLocationData($this->geoData);
}
php artisan geo:add-language bn
php artisan geo:translations-generate --locale=bn
echo geniusTrans('welcome_message');
// In your JS file
const input = document.querySelector("#phone");
const iti = window.intlTelInput(input, {
initialCountry: document.querySelector('.system-default-country-code').dataset.value,
// other options...
});
form.addEventListener('submit', (e) => {
if (!iti.isValidNumber()) {
e.preventDefault();
alert('Invalid phone number');
}
});
// Add timezone column to users table
php artisan geo:add-timezone-column users
// In User model
protected static function boot() {
parent::boot();
static::creating(function ($user) {
$user->timezone = laravelGeoGenius()->timezone()->getUserTimezone();
});
}
Session vs Cache Conflicts:
php artisan session:clear
laravelGeoGenius()->geo()->forceRefresh() to bypass session cache.IP Detection Issues:
127.0.0.1) returns external IP by default. For testing:
laravelGeoGenius()->geo()->setTestIp('8.8.8.8');
laravelGeoGenius()->geo()->setLocationData(['country' => 'us']);
Translation Quirks:
auto_translate: true in config.geniusTranslateNumber() for locale-specific number formatting:
echo geniusTranslateNumber(12345, 'bn'); // Bengali digits
Phone Input Edge Cases:
intl-tel-input CSS/JS is loaded before initialization.system-default-country-code span in DOM.dd(laravelGeoGenius()->geo()->getRawLocationData());
laravelGeoGenius()->setDebug(true);
// Check Laravel logs for detailed API responses
php artisan cache:clear
php artisan config:clear
laravelGeoGenius()->geo()->setIpProvider(function() {
return request()->ip() ?? 'custom_ip_here';
});
laravelGeoGenius()->geo()->extendDetection(function($data) {
$data['custom_field'] = 'value';
return $data;
});
laravelGeoGenius()->timezone()->extendConversion(function($date, $timezone) {
// Modify conversion logic
return $date->setTimezone($timezone);
});
laravelGeoGenius()->geo()->disableAutoDetection();
laravelGeoGenius()->geo()->setCacheTtl(1440); // 24 hours
laravelGeoGenius()->geo()->batchLocate(['ip1', 'ip2', 'ip3']);
Phone Input Restrictions:
only_countries_mode: true to restrict dropdown:
'phone_input' => [
'only_countries_mode' => true,
'only_countries_array' => ['us', 'ca', 'uk']
]
only_countries_array.Locale Fallback:
config/laravel-geo-genius.php:
'language' => [
'fallback_locales' => ['en', 'bn'],
'default_locale' => 'en'
]
Timezone Database:
laravelGeoGenius()->timezone()->addCustomTimezone('Custom/Zone', 'UTC+5');
How can I help you explore Laravel packages today?