NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

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 geocoding

locateRequest() 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ťTypObsah
humanReadablestringZobrazovaný popis, napr. naformátovaná adresa alebo „Mesto, Región Krajina“.
streetstringUlica — vypĺňa len Google; pri IP poskytovateľoch prázdna.
citystringNázov mesta.
regionstringRegión / štát; predvolene ''.
postalCodestringPSČ; predvolene ''.
countryIsoCodestringISO kód krajiny, napr. US.
latitudefloatZemepisná šírka.
longitudefloatZemepisná dĺžka.
timezonestringČasové pásmo IANA, napr. America/Los_Angeles — vypĺňajú ho len IP poskytovatelia; predvolene ''.
typeGeolocationTypeIp, 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 object

Hromadné 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 kryptomien

Odoslaní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.