Ermitteln Sie mithilfe verschiedener Dienste (online und lokal) den Standort eines Besuchers anhand seiner IP-Adresse.
Für die Installation des Speicherorts mit composer require
:
composer require stevebauman/location
Veröffentlichen Sie die Konfigurationsdatei (dadurch wird eine location.php
Datei im config
erstellt):
php artisan vendor:publish --provider= " StevebaumanLocationLocationServiceProvider "
use Stevebauman Location Facades Location ;
if ( $ position = Location:: get ()) {
// Successfully retrieved position.
echo $ position -> countryName ;
} else {
// Failed retrieving position.
}
Wichtig :
- Diese Methode ruft die IP-Adresse des Benutzers über
request()->ip()
ab.- In der Standardkonfiguration ist
testing.enabled
aktiv, die zurückgegebene IP-Adresse liegt in den USA. Deaktivieren Sie es, um die echte IP-Adresse des Clients zu erhalten.
$ position = Location:: get ( ' 192.168.1.1 ' );
Sie können Location::fake
mit einer Reihe von IP-Adressmustern und ihren erwarteten Positionen aufrufen, um den Standort einer IP-Adresse zu fälschen:
use Stevebauman Location Position ;
use Stevebauman Location Facades Location ;
Location:: fake ([
' 127.0.0.1 ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
])
]);
// Somewhere in your application...
$ position = Location:: get ( ' 127.0.0.1 ' ); // Position
Wenn Sie möchten, können Sie ein Sternchen verwenden, um für jede angegebene IP-Adresse dieselbe Position zurückzugeben:
Location:: fake ([
' * ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
])
]);
$ position = Location:: get ( $ anyIpAddress ); // Position
Wenn keine Erwartungen angegeben werden oder eine Erwartung nicht erfüllt wird, Location::get
false
zurück:
Location:: fake ();
Location:: get ( $ anyIpAddress ); // false
Wenn Ihre Anwendung versucht, die Standorte mehrerer IP-Adressen abzurufen, können Sie mehrere Erwartungsmuster für IP-Adressen angeben:
Location:: fake ([
' 127.0.0.1 ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
]),
' 192.168.1.1 ' => Position:: make ([
' countryName ' => ' Canada ' ,
' countryCode ' => ' CA ' ,
// ...
]),
]);
Verfügbare Treiber:
Es wird empfohlen, MaxMind mithilfe einer lokalen Datenbank als Fallback-Treiber einzurichten, damit einige Standortinformationen zurückgegeben werden, falls ein Ratenlimit von den externen Webdiensten erreicht wird.
Um MaxMind so einzurichten, dass es den Standort des Benutzers von Ihrem eigenen Server abruft, müssen Sie:
MAXMIND_LICENSE_KEY
in Ihrer .env
Dateiphp artisan location:update
aus, um die neueste .mmdb
Datei in Ihr database/maxmind
-Verzeichnis herunterzuladenHinweis : Denken Sie daran, dass Sie diese Datei aktualisieren müssen, indem Sie
location:update
regelmäßig ausführen, um die aktuellsten Informationen von Ihren Besuchern abzurufen.
In der Konfigurationsdatei können Sie beliebig viele Fallback-Treiber angeben. Es wird empfohlen, den MaxMind-Treiber mit der .mmdb
Datei der lokalen Datenbank (oben erwähnt) zu konfigurieren, damit Sie immer einige allgemeine Standortinformationen vom Besucher abrufen.
Wenn beim Versuch, einen Treiber abzurufen, eine Ausnahme auftritt (z. B. ein 400/500-Fehler, wenn sich die API des Anbieters ändert), wird automatisch der nächste Treiber in der Reihe verwendet.
Um Ihren eigenen Treiber zu erstellen, erstellen Sie einfach eine Klasse in Ihrer Anwendung und erweitern Sie den abstrakten Treiber:
namespace App Location Drivers ;
use Illuminate Support Fluent ;
use Illuminate Support Facades Http ;
use Stevebauman Location Position ;
use Stevebauman Location Request ;
use Stevebauman Location Drivers Driver ;
class MyDriver extends Driver
{
protected function process ( Request $ request ): Fluent
{
$ response = Http:: get ( " https://driver-url.com " , [ ' ip ' => $ request -> getIp ()]);
return new Fluent ( $ response -> json ());
}
protected function hydrate ( Position $ position , Fluent $ location ): Position
{
$ position -> countryCode = $ location -> country_code ;
return $ position ;
}
}
Fügen Sie dann den Namen Ihrer Treiberklasse in die Konfigurationsdatei ein:
// config/location.php
' driver ' => App Location Drivers MyDriver::class,
In Version 7 wurde die Codebasis mit strengen PHP-Typen, aktualisierten PHP- und Laravel-Versionsanforderungen, einer aktualisierten Driver
sowie einer kleinen Konfigurationserweiterung aktualisiert.
In Version 7 können Standorttreiber jetzt eine Updatable
Schnittstelle implementieren, die es ermöglicht, sie mit dem Befehl location:update
zu aktualisieren. Derzeit unterstützt dies nur der MaxMind-Treiber.
Um Ihre Konfigurationsdatei zu aktualisieren, um die neueste MaxMind-Datenbankdatei automatisch herunterladen zu können, fügen Sie die folgende url
Konfigurationsoption in Ihre Datei config/location.php
ein:
// config/location.php
return [
'maxmind' => [
// ...
'local' => [
// ...
+ 'url' => sprintf('https://download.maxmind.com/app/geoip_download_by_token?edition_id=GeoLite2-City&license_key=%s&suffix=tar.gz', env('MAXMIND_LICENSE_KEY')),
],
],
];
Sobald Sie fertig sind, können Sie den folgenden Handwerkerbefehl ausführen, um die neueste .mmdb
Datei herunterzuladen:
php artisan location:update
In Version 7 wurde die Codebasis mit strengen PHP-Typen, aktualisierten PHP- und Laravel-Versionsanforderungen und einer aktualisierten Driver
aktualisiert.
Wenn Sie Ihre eigene benutzerdefinierte Treiberimplementierung erstellt haben, müssen Sie diese aktualisieren, um die Basisklasse Driver
oder HttpDriver
zu verwenden.
Wenn Sie einen Standort über einen HTTP-Dienst abrufen, kann es sinnvoll sein, den HttpDriver
zu erweitern, um den Code zu reduzieren, den Sie schreiben müssen:
namespace AppLocationDrivers;
use IlluminateSupportFluent;
use StevebaumanLocationPosition;
- use StevebaumanLocationDriversDriver;
+ use StevebaumanLocationDriversHttpDriver;
- class MyDriver extends Driver
+ class MyDriver extends HttpDriver
{
- public function url($ip)
+ public function url(string $ip): string;
{
return "http://driver-url.com?ip=$ip";
}
- protected function process($ip)
- {
- return rescue(function () use ($ip) {
- $response = json_decode(file_get_contents($this->url($ip)), true);
-
- return new Fluent($response);
- }, $rescue = false);
- }
- protected function hydrate(Position $position, Fluent $location)
+ protected function hydrate(Position $position, Fluent $location): Position;
{
$position->countryCode = $location->country_code;
return $position;
}
}
Der Standort wird so weit wie möglich gemäß den Richtlinien zur semantischen Versionierung versioniert.
Veröffentlichungen werden im folgenden Format nummeriert:
<major>.<minor>.<patch>
Und nach folgenden Richtlinien konstruiert:
Nebenversionen werden nicht einzeln verwaltet und es wird empfohlen, ein Upgrade auf die nächste Nebenversion durchzuführen.
Hauptversionen werden einzeln über separate Zweige verwaltet.