---
title: "Ako to funguje — Geolocation for Laravel | Roundly"
description: "Zoradená pipeline pomenovaných poskytovateľov — vyhráva prvá skutočná odpoveď, nedostupné API sa preskočí a voliteľná záložná poloha je posledná možnosť."
url: https://roundly-consulting.com/sk/open-source/navody/geolocation-for-laravel/ako-to-funguje
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Geolocation for Laravel](https://roundly-consulting.com/sk/open-source/navody/geolocation-for-laravel.md)

# Ako to funguje

Každé vyhľadávanie prechádza zoradenou pipeline pomenovaných poskytovateľov a vráti prvú nenulovú odpoveď. GeolocationProvider zmení GeolocationQuery (IP, súradnice alebo adresa) na Location; DistanceProvider zmení DistanceQuery (dva páry súradníc a spôsob dopravy) na Distance. Poskytovatelia, ktorí neimplementujú kontrakt potrebný pre dané volanie, sa preskočia:

```php
use RoundlyConsulting\Geolocation\DataTransferObjects\Distance;
use RoundlyConsulting\Geolocation\DataTransferObjects\DistanceQuery;
use RoundlyConsulting\Geolocation\DataTransferObjects\GeolocationQuery;
use RoundlyConsulting\Geolocation\DataTransferObjects\Location;

// RoundlyConsulting\Geolocation\GeolocationProvider
public function locate(GeolocationQuery $query): ?Location;

// RoundlyConsulting\Geolocation\DistanceProvider
public function distance(DistanceQuery $query): ?Distance;
```

## Pribalení poskytovatelia

| Meno | Trieda | Poloha | Vzdialenosť | Zdroj |
| --- | --- | --- | --- | --- |
| `maxmind_database` | `MaxMindDatabaseProvider` | podľa IP | nie | Lokálny súbor .mmdb (natívna čítačka) |
| `maxmind_web` | `MaxMindWebServiceProvider` | podľa IP | nie | Webová služba MaxMind GeoIP2 Precision |
| `ip2location` | `IP2LocationProvider` | podľa IP | nie | HTTP API ip2location.io |
| `ipinfo` | `IpInfoProvider` | podľa IP | nie | HTTP API ipinfo.io |
| `google` | `GoogleProvider` | podľa súradníc alebo adresy | áno | Google Geocoding API + Routes API |
| `default` | `DefaultLocationProvider` | statická záloha, keď ju nastavíte | nie | Hodnoty z konfigurácie |

Oba poskytovatelia MaxMind sú predvolene vypnutí a okamžite vracajú null, kým ich nezapnete a nedodáte prístupové údaje alebo cestu k databáze.

## Pipeline

Poskytovatelia sa skúšajú v poradí pipeline; prednosť zmeníte preusporiadaním v konfigurácii:

```php
// config/geolocation.php — consulted top to bottom, the first non-null answer wins
'pipeline' => ['maxmind_database', 'maxmind_web', 'ip2location', 'ipinfo', 'google', 'default'],
```

Pribalené meno, ktoré ste z mapy providers odstránili, sa potichu preskočí; akékoľvek iné meno v pipeline, ktoré nie je v mape ani zaregistrované cez extend(), vyhodí UnknownProviderException. Poskytovateľ, ktorý dopyt nevie obslúžiť — napríklad Google pri IP alebo IP poskytovateľ pri adrese — vráti null a skúsi sa ďalší. Aj chybové odpovede sa zmenia na null, takže zlyhávajúci poskytovateľ odovzdá slovo ďalšiemu.

Rovnako sa počíta poskytovateľ, ktorého API sa vôbec nedá dosiahnuť — timeout, zlyhanie DNS, odmietnuté spojenie —, aj požiadavka, ktorú Google odmietne ako celok (kľúč bez povoleného API, vyčerpaná kvóta): pipeline namiesto výnimky pokračuje ďalej a chybu ohlási, bez prístupových údajov, v udalosti LocationResolutionFailed (pri vzdialenosti v DistanceResolutionFailed). Niektoré chyby vyhľadávanie zámerne ukončia aj naďalej: RateLimitExceededException pri rýchlom zlyhaní, chýbajúca alebo poškodená databáza MaxMind a akákoľvek výnimka z vášho vlastného poskytovateľa (pozrite Výnimky).

## Prázdne odpovede

Prázdna odpoveď sa počíta ako žiadna odpoveď. Location bez časti adresy, bez krajiny a so súradnicami 0,0 ($location->isEmpty()) — napríklad odpoveď IP2Location pre súkromnú IP — sa preskočí a opýta sa ďalší poskytovateľ. Location, ktorú dostanete, preto vždy niečo určuje, hoci hrubej zhode podľa IP môže chýbať mesto alebo krajina.

## Čo predvolene volá sieť

S dodanou konfiguráciou pošle vyhľadávanie IP adresu na api.ip2location.io a potom na ipinfo.io, aj bez IP2LOCATION\_API\_KEY či IPINFO\_TOKEN (požiadavka je potom neautentifikovaná). Vyhľadávanie adresy či súradníc a každá vzdialenosť idú na Google — vyhľadávanie na Geocoding API, vzdialenosti na Routes API —, ktorý na úspech potrebuje GOOGLE\_MAPS\_API\_KEY s oboma povolenými API. maxmind\_database a default sa siete nikdy nedotknú a v testoch Geolocation::fake() nevolá žiadneho poskytovateľa.

Pipeline zúžte na poskytovateľov, ku ktorým máte prístupové údaje — každý, kto v nej zostane, sa postupne skúša, kým niekto neodpovie, a každý HTTP poskytovateľ znamená skutočnú odchádzajúcu požiadavku:

```php
// Only the providers you have credentials for: offline first, fallback last
'pipeline' => ['maxmind_database', 'ipinfo', 'google', 'default'],
```

Ak majú IP návštevníkov zostať na vašich serveroch, ponechajte len offline poskytovateľov:

```php
// Keep visitor IPs on your own servers — no provider here calls the network
'pipeline' => ['maxmind_database', 'default'],
```

## Záložná poloha

Poskytovateľ default odpovedá, až keď nastavíte záložnú polohu (akúkoľvek hodnotu default.\*). S dodanými prázdnymi hodnotami odpovie tiež null, takže nevyriešené vyhľadávanie zostane null. Keď odpovie, Location má typ GeolocationType::Default, takže zálohu od skutočného výsledku rozlíšite:

```php
use RoundlyConsulting\Geolocation\Enum\GeolocationType;
use RoundlyConsulting\Geolocation\Facades\Geolocation;

$location = Geolocation::locateRequest();

if ($location?->type === GeolocationType::Default) {
    // No real provider answered — this is the configured fallback location.
}
```

Záložná poloha sa nikdy necachuje — odpovedala len preto, že skutoční poskytovatelia nie, takže ďalšie volanie sa ich opýta znova. Ak chcete, aby vyhľadávanie bez výsledku vrátilo null (a udalosť LocationResolutionFailed), nechajte default.\* prázdne alebo default z pipeline odstráňte.

## Pomenovaní poskytovatelia

Kľúč providers je pomenovaná mapa — pipeline, provider() aj using() odkazujú na poskytovateľov menom. Ak sa žiadne meno z pipeline s mapou nezhoduje, použije sa poradie mapy. Plochý zoznam tried už balík neprijíma:

```php
use RoundlyConsulting\Geolocation\Providers\DefaultLocationProvider;
use RoundlyConsulting\Geolocation\Providers\IpInfoProvider;

// Every entry needs a name — the pipeline and provider() address providers by it
'providers' => [
    'ipinfo' => IpInfoProvider::class,
    'default' => DefaultLocationProvider::class,
],

// An unnamed entry throws UnknownProviderException on the first lookup
'providers' => [IpInfoProvider::class],
```

## 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/geolocation-for-laravel.md)
