Download the PHP package mayaram/laravel-browser-location without Composer
On this page you can find all versions of the php package mayaram/laravel-browser-location. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download mayaram/laravel-browser-location
More information about mayaram/laravel-browser-location
Files in mayaram/laravel-browser-location
Package laravel-browser-location
Short Description HTML5 browser geolocation package for Laravel with Livewire 4 support, GPS capture, reverse geocoding, maps, and API integration.
License MIT
Homepage https://github.com/mayaramyadav/laravel-browser-location
Informations about the package laravel-browser-location
Laravel Browser Location
Capture browser-based GPS location in Laravel using the HTML5 Geolocation API.
Works with Laravel 10-13, plain Blade, and Livewire 3 / 4.
Table of Contents
- Core features
- Installation
- Usage: Blade component
- All Component Props
- Browser Events
- JavaScript API
- Configuration
- Geocoder service (Google / Mapbox / OpenStreetMap)
- Configure provider in
.env - Usage via facade
- Usage via dependency injection (preferred)
- Normalized response shape
- Best practices
- Configure provider in
- Location persistence collections
- 1) Add the
HasLocationstrait to your model - 2) Save locations manually (Spatie-style API)
- 3) Read stored locations
- 4) Automatic saving flow (no manual save required)
- Persistence config
- Optional explicit locationable models
- 1) Add the
- Livewire integration (v3 & v4)
- Basic setup
- Trait helper methods
- Livewire 3 & 4 — recommended attributes
- Livewire 4: using #[On] to react via JS dispatch
- Compatibility matrix
- Middleware Validation
- Testing
- License
Core features
- Accurate GPS capture with HTML5 Geolocation
- Works with plain Blade and Livewire 3 — Livewire is fully optional
- Ready-to-use Blade component (
<x-browser-location-tracker />) - SPA-friendly: re-captures after every Livewire navigation without page reload
- Permission + error handling for denied / timeout / unavailable states
- Accuracy detection (
excellent,good,poor,unknown) - Typed PHP helper methods on the Livewire trait
- Provider-based geocoding + reverse geocoding (Google, Mapbox, OpenStreetMap)
- Cache-ready geocoder responses for fast repeated lookups
- Spatie-style location collections with polymorphic model ownership
- Automatic DB persistence (
JS → API → Laravel) - Auto-loaded migration for
browser_locationstable - One-command setup:
php artisan browser-location:install - Middleware alias for route-level location validation (
browser-location.validate)
Installation
Run the installer command:
This publishes config / views / migrations and runs migrations automatically.
Usage: Blade component
Drop the tracker anywhere in any Blade view — including inside a Livewire component:
Default behaviour:
auto-capture="true"andforce-permission="true"are on by default, so the browser will request the user's location immediately. Set them tofalseif you want manual control.
All Component Props
| Prop | Type | Default | Description |
|---|---|---|---|
button-text |
string | 'Share GPS location' |
Label for the (hidden by default) trigger button. |
auto-capture |
bool | true |
Requests location on page load and after every Livewire navigation. |
force-permission |
bool | true |
Shows a full-screen overlay until the user grants permission. |
watch |
bool | false |
Continuously tracks position using watchPosition(). |
livewire-method |
string | 'setBrowserLocation' |
Livewire component method called on successful capture. Leave empty in plain Blade. |
required-accuracy-meters |
float | 200 |
Threshold for the is_accurate flag in the payload. |
enable-high-accuracy |
bool | true |
Requests the most accurate reading from the device GPS. |
timeout |
int | 12000 |
Milliseconds before the location request times out. |
maximum-age |
int | 0 |
Milliseconds a cached location is considered fresh (0 = always fresh). |
auto-save |
bool | false |
Automatically POSTs captures to the package save endpoint. |
capture-endpoint |
string | '/browser-location/capture' |
Endpoint used by JS for automatic persistence. |
collection-name |
string | 'default' |
Target location collection for automatic save. |
locationable-type |
string | auth user morph class | Override the model class that owns the location (must be allow-listed). |
locationable-id |
mixed | auth user key | Override the model key. |
event-name |
string | 'browser-location:updated' |
JS event dispatched on successful capture. |
error-event-name |
string | 'browser-location:error' |
JS event dispatched on error. |
permission-event-name |
string | 'browser-location:permission' |
JS event dispatched when permission state changes. |
Example with custom options:
Browser Events
The tracker dispatches these native DOM events on document:
| Event | Description |
|---|---|
browser-location:updated |
Successful capture — payload contains full location data |
browser-location:error |
Error — payload contains code and message |
browser-location:permission |
Permission state changed — payload contains state |
browser-location:saved |
Location persisted to DB — payload contains persistence result |
browser-location:save-error |
Persistence request failed |
JavaScript API
Configuration
Creates config/browser-location.php. Key options:
Geocoder service (Google / Mapbox / OpenStreetMap)
Configure provider in .env
Usage via facade
Usage via dependency injection (preferred)
Normalized response shape
Best practices
- Prefer dependency injection for testability.
- Keep API credentials in
.env— never commit keys. - Enable cache in production to reduce cost and latency.
- For OpenStreetMap/Nominatim, always supply a real
user_agentand contact email. - Catch
Mayaram\BrowserLocation\Exceptions\GeocoderExceptionat your application boundary.
Location persistence collections
1) Add the HasLocations trait to your model
2) Save locations manually (Spatie-style API)
3) Read stored locations
4) Automatic saving flow (no manual save required)
When <x-browser-location-tracker /> captures a location the package:
- POSTs coordinates to
POST /browser-location/capture - Validates via
browser-location.validatemiddleware - Applies quality checks (accuracy threshold + anti-duplicate rules)
- Persists in
browser_locationsand enrichesmetawith raw GPS, geocoder response, IP, user-agent
Persistence config
Optional explicit locationable models
Livewire integration (v3 & v4)
Basic setup
1. Add the trait to your Livewire component:
2. Add the tracker inside the component's Blade view:
Trait helper methods
All methods are available on any Livewire component that uses InteractsWithBrowserLocation:
Coordinate helpers
| Method | Returns | Description |
|---|---|---|
hasLocation() |
bool |
true once the browser sends valid coordinates |
getLatitude() |
?float |
Captured latitude |
getLongitude() |
?float |
Captured longitude |
getAccuracy() |
?float |
GPS accuracy in metres |
getAccuracyLevel() |
string |
'excellent' / 'good' / 'poor' / 'unknown' |
browserLocationIsAccurate(?float $max) |
bool |
Whether accuracy is within the given or configured threshold |
Permission & error helpers
| Method | Returns | Description |
|---|---|---|
getLocationPermission() |
?string |
'granted', 'denied', 'prompt', or null |
isLocationDenied() |
bool |
Quick check for denied permission |
getLocationErrorCode() |
?int |
1 = denied, 2 = unavailable, 3 = timeout |
getLocationErrorMessage() |
?string |
Human-readable error from the browser |
Other helpers
| Method | Description |
|---|---|
setBrowserLocation(array $location) |
Receives the payload from JS (called automatically) |
resetBrowserLocation() |
Clears $browserLocation (e.g. after saving a trip) |
getBrowserLocationJson() |
Returns the raw payload as a JSON string |
Lifecycle hook (onBrowserLocationUpdated)
Implement this method on your component to react every time a new location arrives:
Livewire 3 & 4 — recommended attributes
The trait itself does not include #[Locked] or #[On] because Livewire is an optional dependency. Add them directly on your component for the best security and DX:
Both
#[Locked]and#[On]work identically in Livewire 3 and Livewire 4.
Livewire 4: using #[On] to react via JS dispatch
An alternative to having JS call setBrowserLocation directly is to dispatch a browser event and let Livewire 4's #[On] handle it:
Compatibility matrix
Framework support
| Laravel version | Support |
|---|---|
| 10.x | ✅ |
| 11.x | ✅ |
| 12.x | ✅ |
| 13.x | ✅ |
| Feature | Plain Blade | Livewire 3 | Livewire 4 |
|---|---|---|---|
<x-browser-location-tracker> |
✅ | ✅ | ✅ |
| Auto-capture on page load | ✅ | ✅ | ✅ |
| Hidden form inputs | ✅ | ✅ | ✅ |
wire:ignore prevents DOM morphing |
— | ✅ | ✅ |
| JS calls Livewire method on capture | — | ✅ | ✅ |
| Re-capture after Livewire navigate | — | ✅ | ✅ |
InteractsWithBrowserLocation helpers |
— | ✅ | ✅ |
#[Locked] / #[On] on your component |
— | ✅ | ✅ |
Middleware Validation
The middleware accepts location from:
- Request body fields (
latitude,longitude, …) - A
locationobject in the request body - An
X-Browser-LocationJSON header
Testing
License
MIT
All versions of laravel-browser-location with dependencies
illuminate/http Version ^10.0|^11.0|^12.0|^13.0
illuminate/support Version ^10.0|^11.0|^12.0|^13.0