Получите местоположение посетителя по его IP-адресу, используя различные сервисы (онлайн и локальные).
Место установки с помощью composer require
:
composer require stevebauman/location
Опубликуйте файл конфигурации (в каталоге config
будет создан файл location.php
):
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.
}
Важный :
- Этот метод получает IP-адрес пользователя через
request()->ip()
.- В конфигурации по умолчанию
testing.enabled
активно, возвращаемый IP-адрес находится в США. Отключите его, чтобы получить реальный IP-адрес клиента.
$ position = Location:: get ( ' 192.168.1.1 ' );
Вы можете вызвать Location::fake
с массивом шаблонов IP-адресов и их ожидаемыми позициями, чтобы подделать местоположение 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
Если вы предпочитаете, вы можете использовать звездочку, чтобы вернуть ту же позицию для любого заданного IP-адреса:
Location:: fake ([
' * ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
])
]);
$ position = Location:: get ( $ anyIpAddress ); // Position
Если ожидания не указаны или ожидание не соответствует, Location::get
вернет false
:
Location:: fake ();
Location:: get ( $ anyIpAddress ); // false
Если ваше приложение пытается получить расположение нескольких IP-адресов, вы можете предоставить несколько шаблонов ожидания IP-адресов:
Location:: fake ([
' 127.0.0.1 ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
]),
' 192.168.1.1 ' => Position:: make ([
' countryName ' => ' Canada ' ,
' countryCode ' => ' CA ' ,
// ...
]),
]);
Доступные драйверы:
Рекомендуется настроить MaxMind в качестве резервного драйвера с использованием локальной базы данных, чтобы некоторая информация о местоположении возвращалась в случае достижения ограничения скорости от внешних веб-служб.
Чтобы настроить MaxMind для получения местоположения пользователя с вашего собственного сервера, вам необходимо:
.env
используя ключ MAXMIND_LICENSE_KEY
.php artisan location:update
, чтобы загрузить последнюю версию файла .mmdb
в каталог database/maxmind
.Примечание . Имейте в виду, что вам необходимо регулярно обновлять этот файл, запуская
location:update
чтобы получать самую свежую информацию от ваших посетителей.
В файле конфигурации вы можете указать столько резервных драйверов, сколько пожелаете. Рекомендуется настроить драйвер MaxMind с использованием файла .mmdb
локальной базы данных (упомянутого выше), чтобы вы всегда получали некоторую общую информацию о местоположении от посетителя.
Если при попытке получить драйвер возникает исключение (например, ошибка 400/500 при изменении API провайдера), он автоматически будет использовать следующий драйвер в очереди.
Чтобы создать свой собственный драйвер, просто создайте класс в своем приложении и расширьте абстрактный драйвер:
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 ;
}
}
Затем вставьте имя класса драйвера в файл конфигурации:
// config/location.php
' driver ' => App Location Drivers MyDriver::class,
В версии 7 в базу кода были добавлены строгие типы PHP, обновлены требования к версии PHP и Laravel, обновлена структура Driver
, а также небольшое дополнение к конфигурации.
В версии 7 драйверы местоположения теперь могут реализовать Updatable
интерфейс, который позволяет их обновлять с помощью команды location:update
. В настоящее время это поддерживает только драйвер MaxMind.
Чтобы обновить файл конфигурации и иметь возможность автоматически загружать последнюю версию файла базы данных MaxMind, вставьте приведенный ниже параметр конфигурации url
в файл 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')),
],
],
];
После этого вы можете выполнить приведенную ниже команду artisan, чтобы загрузить последнюю версию файла .mmdb
:
php artisan location:update
В версии 7 в базу кода были добавлены строгие типы PHP, обновлены требования к версиям PHP и Laravel, а также обновлена структура Driver
.
Если вы создали собственную реализацию пользовательского драйвера, вам необходимо обновить ее, чтобы использовать базовый класс Driver
или HttpDriver
.
Если вы получаете местоположение с помощью службы HTTP, может быть полезно расширить HttpDriver
, чтобы сократить объем кода, который вам нужно написать:
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;
}
}
Версионирование местоположения осуществляется в максимально возможной степени в соответствии с рекомендациями по семантическому версионированию.
Релизы будут нумероваться в следующем формате:
<major>.<minor>.<patch>
И построен с учетом следующих рекомендаций:
Второстепенные версии не поддерживаются индивидуально, и вам рекомендуется выполнить обновление до следующей второстепенной версии.
Основные версии поддерживаются индивидуально в отдельных ветках.