makidizajnerica/laravel-geolocation

v2.0.1 2022-07-21 20:13 UTC

This package is auto-updated.

Last update: 2024-09-22 00:53:50 UTC


README

Laravel GeoLocation Logo

Laravel GeoLocation

Laravel 包,用于获取给定 IP 地址的区域、城市、国家、时区、货币等详细信息。

安装

composer require makidizajnerica/laravel-geolocation

关于注册服务提供者,不是必需的,Laravel 将使用包发现自动加载提供者。

使用方法

使用外观

MakiDizajnerica\GeoLocation\Facades\GeoLocation::lookup() 的返回值是 Illuminate\Support\Collection 的实例。要了解更多关于 Laravel 集合的信息,请访问 Collections - Laravel

use MakiDizajnerica\GeoLocation\Facades\GeoLocation;

$collection = GeoLocation::lookup('8.8.4.4');

echo $collection->get('success');
// true

echo $collection->get('ip');
// 8.8.4.4

echo $collection->get('continent');
// North America

echo $collection->get('continentCode');
// NA

echo $collection->get('country');
// United States

echo $collection->get('countryCode');
// US

echo $collection->get('countryFlag');
// https://cdn.ipwhois.io/flags/us.svg

echo $collection->get('countryCapital');
// Washington

echo $collection->get('region');
// California

echo $collection->get('city');
// Mountain View

echo $collection->get('timezone');
// America/Los_Angeles

echo $collection->get('timezoneName');
// Pacific Standard Time

echo $collection->get('currency');
// US Dollar

echo $collection->get('currencyCode');
// USD

echo $collection->get('currencySymbol');
// $

echo $collection->get('latitude');
// 37.3860517

echo $collection->get('longitude');
// -122.0838511

var_dump($collection->toArray());
// Array
// (
//     [success] => 1
//     [ip] => 8.8.4.4
//     [continent] => North America
//     [continentCode] => NA
//     [country] => United States
//     [countryCode] => US
//     [countryFlag] => https://cdn.ipwhois.io/flags/us.svg
//     [countryCapital] => Washington
//     [region] => California
//     [city] => Mountain View
//     [timezone] => America/Los_Angeles
//     [timezoneName] => Pacific Standard Time
//     [currency] => US Dollar
//     [currencyCode] => USD
//     [currencySymbol] => $
//     [latitude] => 37.3860517
//     [longitude] => -122.0838511
// )

您还可以在运行时切换驱动程序

use MakiDizajnerica\GeoLocation\Facades\GeoLocation;

$collection = GeoLocation::driver('geoplugin')->lookup('8.8.4.4');

包包含多个预定义的驱动程序,其中一些需要 API_KEY 才能工作。您可以在 .env 文件中注册这些密钥

ABSTRACTAPI_KEY=*****
IPDATA_KEY=*****

预定义的驱动程序

根据使用的驱动程序,可能会得到不同的结果。

请求宏

在您的控制器中,Illuminate\Http\Request $request 将具有 geolocation() 方法。

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::get('/', function (Request $request) {

    dd($request->geolocation()->toArray());

    return view('welcome');
});

// Array
// (
//     [success] => 1
//     [ip] => 8.8.4.4
//     [continent] => North America
//     [continentCode] => NA
//     [country] => United States
//     [countryCode] => US
//     [countryFlag] => https://cdn.ipwhois.io/flags/us.svg
//     [countryCapital] => Washington
//     [region] => California
//     [city] => Mountain View
//     [timezone] => America/Los_Angeles
//     [timezoneName] => Pacific Standard Time
//     [currency] => US Dollar
//     [currencyCode] => USD
//     [currencySymbol] => $
//     [latitude] => 37.3860517
//     [longitude] => -122.0838511
// )

发布配置文件

要发布 geolocation.php 配置文件,请使用以下命令

php artisan vendor:publish --tag=geolocation-config

创建自定义驱动程序

在创建自定义驱动程序时,请确保扩展 MakiDizajnerica\GeoLocation\GeoLocationDriver 类。然后定义两个方法 lookup()format()

use MakiDizajnerica\GeoLocation\GeoLocationDriver;

class CustomDriver extends GeoLocationDriver
{
    public function lookup($ipAddress): array
    {
        //
    }

    public function format(array $data): array
    {
        return [
            //
        ];
    }
}

方法 lookup($ipAddress) 接受一个类型为 string 的参数,表示 IP 地址。在此方法中,您编写请求逻辑(发送请求、检查响应等),然后只需将响应数据作为数组返回。如果由于某种原因请求失败,您可以抛出 MakiDizajnerica\GeoLocation\Exceptions\GeoLocationDriverException,该异常将被捕获并在日志文件中报告。

方法 format($data) 接受一个类型为 array 的参数,表示从 lookup() 方法返回的响应数据,在此您可以将数据格式化为包含自己的键/值对的数组。

CustomDriver 类中,您将有两个方法可用,即 options()apiEndpoint()

方法 options($key) 接受一个类型为 string 的参数 $key,并根据提供的 $key 返回驱动程序选项。

方法 apiEndpoint($ipAddress) 接受一个类型为 string 的参数 $ipAddress,并返回格式化后的 API 端点 URL,其中包含传递的 $ipAddress

如果您计划使用 Laravel 内置的 Illuminate\Support\Facades\Http HTTP 客户端,则可以在您的 CustomDriver 类中使用 MakiDizajnerica\GeoLocation\Support\HandlingHttpResponse 特性。

use Illuminate\Support\Facades\Http;
use MakiDizajnerica\GeoLocation\GeoLocationDriver;
use MakiDizajnerica\GeoLocation\Support\HandlingHttpResponse;

class CustomDriver extends GeoLocationDriver
{
    use HandlingHttpResponse;

    public function lookup($ipAddress): array
    {
        $response = Http::get($this->apiEndpoint($ipAddress));

        $data = $this->decodeResponseData(
            $this->checkResponse($response)
        );

        return $data;
    }

    public function format(array $data): array
    {
        return [
            'ip' => $data['ip'],
            'continent' => $data['continent'],
            'country' => $data['country'],
            'region' => $data['region'],
            'city' => $data['city'],
            'timezone' => $data['timezone'],
            'currency' => $data['currency'],
        ];
    }
}

方法 checkResponse(Response $response) 接受一个类型为 Illuminate\Http\Client\Response 的参数,然后如果响应成功,则返回该响应,否则抛出 MakiDizajnerica\GeoLocation\Exceptions\GeoLocationDriverException

方法 decodeResponseData(Response $response) 接受一个类型为 Illuminate\Http\Client\Response 的参数,然后尝试解析该响应,并返回包含响应数据的数组,或者在失败时返回空数组。

然后,当您编写了查找逻辑并格式化了数据后,您需要在 config/geolocation.php 配置文件中注册您的驱动程序

'drivers' => [

    'customdriver' => [
        'driver' => \CustomDriver::class,
        'api_endpoint' => 'custom-endpoint.com',
        'query_params' => [

            'ip' => '{ip}'

        ],
    ],

]

{ip} 是占位符,其中将放置实际 IP 地址,在 apiEndpoint() 调用中。您可以将占位符放在 api_endpoint

'api_endpoint' => 'custom-endpoint.com/{ip}'

或在上面的 query_params

'query_params' => [

    'ip' => '{ip}'

]

您还可以定义任何其他用大括号括起来的占位符

'query_params' => [

    'ip' => '{ip}'
    'lang' => '{lang}'

]

然后在运行时,将包含该占位符的数组作为键,作为第二个参数传递给 driver() 方法

use MakiDizajnerica\GeoLocation\Facades\GeoLocation;

$collection = GeoLocation::driver('customdriver', ['lang' => 'en'])->lookup('8.8.4.4');

因此,当您在驱动程序查找方法中调用 apiEndpoint() 方法时,返回值应该类似于以下这样

echo $this->apiEndpoint('8.8.4.4');
// custom-endpoint.com?ip=8.8.4.4&lang=en

作者

内曼贾·马里安诺维奇 (n.marijanovic@hotmail.com)

许可证

版权所有 © 2021,内曼贾·马里安诺维奇 n.marijanovic@hotmail.com

版权所有。

有关完整的版权和许可信息,请查看此软件包源根目录中分布的 LICENSE 文件。