Recupere a localização de um visitante a partir de seu endereço IP usando vários serviços (online e locais).
Instale o local usando composer require
:
composer require stevebauman/location
Publique o arquivo de configuração (isso criará um arquivo location.php
dentro do diretório 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 o endereço IP do usuário via
request()->ip()
.- Na configuração padrão,
testing.enabled
está ativo, o endereço IP retornado está nos EUA. Desative-o para obter o endereço IP real do cliente.
$ position = Location:: get ( ' 192.168.1.1 ' );
Você pode chamar Location::fake
com uma série de padrões de endereços IP e suas posições esperadas para falsificar a localização de um endereço 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
Se preferir, você pode usar um asterisco para retornar a mesma posição para qualquer endereço IP fornecido:
Location:: fake ([
' * ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
])
]);
$ position = Location:: get ( $ anyIpAddress ); // Position
Se nenhuma expectativa for fornecida ou uma expectativa não for correspondida, Location::get
retornará false
:
Location:: fake ();
Location:: get ( $ anyIpAddress ); // false
Se seu aplicativo tentar recuperar a localização de vários endereços IP, você poderá fornecer vários padrões de expectativa de endereço IP:
Location:: fake ([
' 127.0.0.1 ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
]),
' 192.168.1.1 ' => Position:: make ([
' countryName ' => ' Canada ' ,
' countryCode ' => ' CA ' ,
// ...
]),
]);
Drivers disponíveis:
É recomendável configurar o MaxMind como um driver substituto usando um banco de dados local para que algumas informações de localização sejam retornadas no caso de atingir um limite de taxa dos serviços da Web externos.
Para configurar o MaxMind para recuperar a localização do usuário do seu próprio servidor, você deve:
.env
usando a chave MAXMIND_LICENSE_KEY
php artisan location:update
para baixar o arquivo .mmdb
mais recente em seu diretório database/maxmind
Observação : lembre-se de que você precisará atualizar esse arquivo executando
location:update
regularmente para recuperar as informações mais atuais de seus visitantes.
No arquivo de configuração, você pode especificar quantos drivers substitutos desejar. Recomenda-se configurar o driver MaxMind com o arquivo .mmdb
do banco de dados local (mencionado acima), para que você esteja sempre recuperando algumas informações genéricas de localização do visitante.
Se ocorrer uma exceção ao tentar obter um driver (como um erro 400/500 se a API do provedor for alterada), ele usará automaticamente o próximo driver da fila.
Para criar seu próprio driver, basta criar uma classe em sua aplicação e estender o Driver abstrato:
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 ;
}
}
Em seguida, insira o nome da classe do driver no arquivo de configuração:
// config/location.php
' driver ' => App Location Drivers MyDriver::class,
Na versão 7, a base de código foi atualizada com tipos PHP estritos, requisitos de versão PHP e Laravel atualizados, uma estrutura Driver
atualizada, bem como uma pequena adição de configuração.
Na versão 7, os drivers de localização agora podem implementar uma interface Updatable
que permite que eles sejam atualizados usando o comando location:update
. Atualmente, apenas o driver MaxMind oferece suporte para isso.
Para atualizar seu arquivo de configuração para poder baixar automaticamente o arquivo de banco de dados MaxMind mais recente, insira a opção de configuração url
abaixo em seu arquivo 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')),
],
],
];
Uma vez feito isso, você pode executar o comando artesanal abaixo para baixar o arquivo .mmdb
mais recente:
php artisan location:update
Na versão 7, a base de código foi atualizada com tipos PHP estritos, requisitos de versão PHP e Laravel atualizados e uma estrutura Driver
atualizada.
Se você criou sua própria implementação de driver customizada, deverá atualizá-la para usar a classe base Driver
ou HttpDriver
.
Se você estiver buscando um local usando um serviço HTTP, pode ser útil estender o HttpDriver
para reduzir o código que você precisa escrever:
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;
}
}
O local é versionado de acordo com as diretrizes de controle de versão semântico, tanto quanto possível.
Os lançamentos serão numerados com o seguinte formato:
<major>.<minor>.<patch>
E construído com as seguintes diretrizes:
As versões secundárias não são mantidas individualmente e você é incentivado a atualizar para a próxima versão secundária.
As versões principais são mantidas individualmente por meio de filiais separadas.