makidizajnerica / laravel-geolocation
Laravel 地理位置包。
Requires
- php: >=8.0
- laravel/framework: >=9.0
Requires (Dev)
- orchestra/testbench: ^6.9
- phpunit/phpunit: ^9.5
README
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 文件。
