Récupérez la localisation d'un visiteur à partir de son adresse IP à l'aide de divers services (en ligne et locaux).
Emplacement d'installation à l'aide composer require
:
composer require stevebauman/location
Publiez le fichier de configuration (cela créera un fichier location.php
dans le répertoire config
) :
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.
}
Important :
- Cette méthode récupère l'adresse IP de l'utilisateur via
request()->ip()
.- Dans la configuration par défaut,
testing.enabled
est actif, l'adresse IP renvoyée est aux USA. Désactivez-le pour obtenir la véritable adresse IP du client.
$ position = Location:: get ( ' 192.168.1.1 ' );
Vous pouvez appeler Location::fake
avec un tableau de modèles d'adresses IP et leurs positions attendues pour simuler l'emplacement d'une adresse IP :
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
Si vous préférez, vous pouvez utiliser un astérisque pour renvoyer la même position pour toute adresse IP donnée :
Location:: fake ([
' * ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
])
]);
$ position = Location:: get ( $ anyIpAddress ); // Position
Si aucune attente n'est donnée ou si une attente ne correspond pas, Location::get
renverra false
:
Location:: fake ();
Location:: get ( $ anyIpAddress ); // false
Si votre application tente de récupérer l'emplacement de plusieurs adresses IP, vous pouvez fournir plusieurs modèles d'attente d'adresse IP :
Location:: fake ([
' 127.0.0.1 ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
]),
' 192.168.1.1 ' => Position:: make ([
' countryName ' => ' Canada ' ,
' countryCode ' => ' CA ' ,
// ...
]),
]);
Pilotes disponibles :
Il est encouragé à configurer MaxMind comme pilote de secours à l'aide d'une base de données locale afin que certaines informations de localisation soient renvoyées en cas d'atteinte d'une limite de débit des services Web externes.
Pour configurer MaxMind afin de récupérer l'emplacement de l'utilisateur à partir de votre propre serveur, vous devez :
.env
à l'aide de la clé MAXMIND_LICENSE_KEY
php artisan location:update
pour télécharger le dernier fichier .mmdb
dans votre répertoire database/maxmind
Remarque : Gardez à l'esprit que vous devrez mettre à jour ce fichier en exécutant
location:update
régulièrement pour récupérer les informations les plus récentes de vos visiteurs.
Dans le fichier de configuration, vous pouvez spécifier autant de pilotes de secours que vous le souhaitez. Il est recommandé de configurer le pilote MaxMind avec le fichier .mmdb
de la base de données locale (mentionné ci-dessus), afin de toujours récupérer des informations de localisation génériques auprès du visiteur.
Si une exception se produit en essayant de récupérer un pilote (comme une erreur 400/500 si l'API du fournisseur change), il utilisera automatiquement le pilote suivant en ligne.
Pour créer votre propre pilote, créez simplement une classe dans votre application et étendez le pilote abstrait :
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 ;
}
}
Ensuite, insérez le nom de votre classe de pilote dans le fichier de configuration :
// config/location.php
' driver ' => App Location Drivers MyDriver::class,
Dans la version 7, la base de code a été mise à jour avec des types PHP stricts, des exigences de version PHP et Laravel mises à jour, une structure Driver
mise à jour, ainsi qu'un petit ajout de configuration.
Dans la version 7, les pilotes d'emplacement peuvent désormais implémenter une interface Updatable
qui permet de les mettre à jour à l'aide de la commande location:update
. Actuellement, seul le pilote MaxMind prend en charge cela.
Pour mettre à jour votre fichier de configuration afin de pouvoir télécharger automatiquement le dernier fichier de base de données MaxMind, insérez l'option de configuration url
ci-dessous dans votre fichier config/location.php
:
// 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')),
],
],
];
Une fois cela fait, vous pouvez exécuter la commande artisanale ci-dessous pour télécharger le dernier fichier .mmdb
:
php artisan location:update
Dans la version 7, la base de code a été mise à jour avec des types PHP stricts, des exigences de version PHP et Laravel mises à jour et une structure Driver
mise à jour.
Si vous avez créé votre propre implémentation de pilote personnalisée, vous devez la mettre à jour pour utiliser la classe de base Driver
ou HttpDriver
.
Si vous récupérez un emplacement à l'aide d'un service HTTP, il peut être utile d'étendre HttpDriver
pour réduire le code que vous devez écrire :
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;
}
}
L'emplacement est versionné autant que possible selon les directives de gestion des versions sémantiques.
Les versions seront numérotées selon le format suivant :
<major>.<minor>.<patch>
Et construit avec les directives suivantes :
Les versions mineures ne sont pas gérées individuellement et vous êtes encouragé à passer à la version mineure suivante.
Les versions majeures sont gérées individuellement via des branches distinctes.