Recupere la ubicación de un visitante a partir de su dirección IP utilizando varios servicios (en línea y locales).
La ubicación de instalación usando composer require
:
composer require stevebauman/location
Publique el archivo de configuración (esto creará un archivo location.php
dentro del directorio 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.
}
Importante :
- Este método recupera la dirección IP del usuario mediante
request()->ip()
.- En la configuración predeterminada,
testing.enabled
está activo y la dirección IP devuelta está en EE. UU. Deshabilítelo para obtener la dirección IP real del cliente.
$ position = Location:: get ( ' 192.168.1.1 ' );
Puedes llamar Location::fake
con una serie de patrones de direcciones IP y sus posiciones esperadas para falsificar la ubicación de una dirección 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 lo prefiere, puede utilizar un asterisco para devolver la misma posición para cualquier dirección IP proporcionada:
Location:: fake ([
' * ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
])
]);
$ position = Location:: get ( $ anyIpAddress ); // Position
Si no se dan expectativas, o una expectativa no se cumple, Location::get
devolverá false
:
Location:: fake ();
Location:: get ( $ anyIpAddress ); // false
Si su aplicación intenta recuperar la ubicación de varias direcciones IP, puede proporcionar varios patrones de expectativa de direcciones IP:
Location:: fake ([
' 127.0.0.1 ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
]),
' 192.168.1.1 ' => Position:: make ([
' countryName ' => ' Canada ' ,
' countryCode ' => ' CA ' ,
// ...
]),
]);
Controladores disponibles:
Se recomienda configurar MaxMind como controlador alternativo utilizando una base de datos local para que se devuelva cierta información de ubicación en caso de alcanzar un límite de velocidad de los servicios web externos.
Para configurar MaxMind para recuperar la ubicación del usuario desde su propio servidor, debe:
.env
usando la clave MAXMIND_LICENSE_KEY
php artisan location:update
para descargar el último archivo .mmdb
en su directorio database/maxmind
Nota : tenga en cuenta que deberá actualizar este archivo ejecutando
location:update
periódicamente para recuperar la información más actualizada de sus visitantes.
En el archivo de configuración, puede especificar tantos controladores alternativos como desee. Se recomienda configurar el controlador MaxMind con el archivo .mmdb
de la base de datos local (mencionado anteriormente), de modo que siempre recupere información de ubicación genérica del visitante.
Si se produce una excepción al intentar obtener un controlador (como un error 400/500 si la API del proveedor cambia), utilizará automáticamente el siguiente controlador en la línea.
Para crear su propio controlador, simplemente cree una clase en su aplicación y extienda el controlador abstracto:
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 ;
}
}
Luego, inserte el nombre de su clase de controlador en el archivo de configuración:
// config/location.php
' driver ' => App Location Drivers MyDriver::class,
En la versión 7, el código base se actualizó con tipos estrictos de PHP, requisitos de versión de PHP y Laravel actualizados, una estructura Driver
actualizada, así como una pequeña adición de configuración.
En la versión 7, los controladores de ubicación ahora pueden implementar una interfaz Updatable
que les permite actualizarse mediante el comando location:update
. Actualmente, sólo el controlador MaxMind admite esto.
Para actualizar su archivo de configuración y poder descargar automáticamente el último archivo de base de datos de MaxMind, inserte la siguiente opción de configuración url
en su archivo 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')),
],
],
];
Una vez hecho esto, puede ejecutar el siguiente comando artesanal para descargar el último archivo .mmdb
:
php artisan location:update
En la versión 7, el código base se actualizó con tipos estrictos de PHP, requisitos de versión PHP y Laravel actualizados y una estructura Driver
actualizada.
Si ha creado su propia implementación de controlador personalizada, debe actualizarla para usar la clase Driver
base o HttpDriver
.
Si está buscando una ubicación mediante un servicio HTTP, puede resultar útil ampliar HttpDriver
para reducir el código que necesita escribir:
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;
}
}
La ubicación se versiona según las pautas de versiones semánticas tanto como sea posible.
Los lanzamientos se numerarán con el siguiente formato:
<major>.<minor>.<patch>
Y construido con las siguientes pautas:
Las versiones menores no se mantienen individualmente y se le recomienda actualizar a la siguiente versión menor.
Las versiones principales se mantienen individualmente a través de ramas separadas.