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.enabledaktiv, 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 ' ); // PositionWenn 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 ); // falseWenn 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:updateregelmäß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.