Určenie polohy
Použite fasádu Geolocation — každá jej metóda je dostupná aj na injektovanom GeolocationManager. Bežné prípady pokrývajú jednoriadkové pomocné metódy:
use RoundlyConsulting\Geolocation\DataTransferObjects\Coordinates;
use RoundlyConsulting\Geolocation\Facades\Geolocation;
$location = Geolocation::locateIp('8.8.8.8');
$location = Geolocation::locateRequest(); // auto-detects the client IP
$location?->city; // "Mountain View"
$location?->region; // "California"
$location?->postalCode; // "94043"
$location?->countryIsoCode; // "US"
$location?->timezone; // "America/Los_Angeles" (IP providers only)
$location?->latitude; // 37.4056
$location = Geolocation::locateAddress('1600 Amphitheatre Pkwy, Mountain View');
$location?->city; // "Mountain View"
$location?->timezone; // "" (Google geocoding returns no timezone)
$location?->latitude; // 37.4224
$location = Geolocation::locateCoordinates(new Coordinates(48.1486, 17.1077)); // reverse geocodinglocateRequest() prečíta IP z aktuálnej požiadavky (alebo z tej, ktorú odovzdáte) a ak žiadna nie je, vráti null. Za load balancerom nastavte v Laraveli dôveryhodné proxy, aby IP požiadavky patrila návštevníkovi, nie proxy.
Každá pomocná metóda vráti null, keď neodpovie žiadny poskytovateľ. Location, ktorú dostanete, vždy niečo určuje — prázdna odpoveď ($location->isEmpty(): bez časti adresy, bez krajiny, súradnice 0,0) sa berie ako minutie —, hoci hrubej zhode podľa IP môže chýbať mesto alebo krajina.
Pomenované dopyty
Každá pomocná metóda zostaví GeolocationQuery a zavolá locate(). Ak už dopyt máte, zostavte ho sami:
use RoundlyConsulting\Geolocation\DataTransferObjects\Coordinates;
use RoundlyConsulting\Geolocation\DataTransferObjects\GeolocationQuery;
use RoundlyConsulting\Geolocation\Facades\Geolocation;
Geolocation::locate(GeolocationQuery::forIp('203.0.113.7'));
Geolocation::locate(GeolocationQuery::forAddress('Main Street 1, Springfield'));
Geolocation::locate(GeolocationQuery::forCoordinates(new Coordinates(48.1486, 17.1077)));Dependency injection
Každý pomocník funguje rovnako aj na injektovanom GeolocationManager — typujte ho všade, kde Laravel rieši závislosti (pozri DI a akcie):
use Illuminate\Http\Request;
use RoundlyConsulting\Geolocation\GeolocationManager;
final class CheckoutController
{
public function show(Request $request, GeolocationManager $geolocation)
{
$country = $geolocation->locateRequest($request)?->countryIsoCode;
// ...
}
}Objekt Location
| Vlastnosť | Typ | Obsah |
|---|---|---|
humanReadable | string | Zobrazovaný popis, napr. naformátovaná adresa alebo „Mesto, Región Krajina“. |
street | string | Ulica — vypĺňa len Google; pri IP poskytovateľoch prázdna. |
city | string | Názov mesta. |
region | string | Región / štát; predvolene ''. |
postalCode | string | PSČ; predvolene ''. |
countryIsoCode | string | ISO kód krajiny, napr. US. |
latitude | float | Zemepisná šírka. |
longitude | float | Zemepisná dĺžka. |
timezone | string | Časové pásmo IANA, napr. America/Los_Angeles — vypĺňajú ho len IP poskytovatelia; predvolene ''. |
type | GeolocationType | Ip, Geolocation (Google) alebo Default (záložná poloha). |
Location aj Distance implementujú Arrayable a JsonSerializable, takže ich môžete vrátiť priamo z controllera:
return response()->json($location); // Location is Arrayable + JsonSerializable
$location->toArray();
// ['humanReadable' => ..., 'street' => ..., 'city' => ..., 'region' => ..., 'postalCode' => ...,
// 'countryIsoCode' => ..., 'latitude' => ..., 'longitude' => ..., 'timezone' => ..., 'type' => 'IP']
$location->coordinates(); // a Coordinates value objectHromadné vyhľadávanie
Určte naraz polohu mnohých IP. Výsledok je indexovaný podľa IP a chyby sú izolované — akákoľvek výnimka pri jednej IP sa pre ňu zmení na null a dávka pokračuje. Rozsah alebo prepis pripojený pred batch() platí pre každú IP:
$results = Geolocation::batch(['8.8.8.8', '1.1.1.1', '203.0.113.7']);
$results['8.8.8.8']?->city; // a Location or null per IP
foreach ($results as $ip => $location) {
// $location is null when that one lookup failed — the batch never aborts
}
// A scope or override chained before batch() applies to every IP
Geolocation::using('maxmind_database', 'ipinfo')->batch($ips);Každá položka prejde bežnou pipeline, cache aj udalosťami. HTTP poskytovatelia dávku automaticky spomalia podľa svojho limitu požiadaviek.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.