使用各種服務(線上和本地)從訪客的 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.
}
重要的:
- 此方法透過
request()->ip()
檢索使用者的 IP 位址。- 在預設組態中,
testing.enabled
處於活動狀態,傳回的 IP 位址位於美國。禁用它以獲取客戶端的真實IP位址。
$ position = Location:: get ( ' 192.168.1.1 ' );
您可以使用一組 IP 位址模式及其預期位置來呼叫Location::fake
來偽造 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 設定為後備驅動程序,以便在達到外部 Web 服務的速率限制時傳回一些位置資訊。
要設定 MaxMind 從您自己的伺服器檢索使用者的位置,您必須:
MAXMIND_LICENSE_KEY
密鑰將其保存到您的.env
檔案中php artisan location:update
將最新的.mmdb
檔下載到您的database/maxmind
目錄中注意:請記住,您需要透過定期執行
location:update
來更新此文件,以從訪客檢索最新資訊。
在設定檔中,您可以根據需要指定任意數量的後備驅動程式。建議使用本機資料庫.mmdb
檔案(如上所述)配置 MaxMind 驅動程序,以便您始終從訪客檢索一些通用位置資訊。
如果嘗試取得驅動程式時發生異常(例如,如果提供者 API 發生更改,則會出現 400/500 錯誤),它將自動使用佇列中的下一個驅動程式。
要創建您自己的驅動程序,只需在應用程式中建立一個類,並擴展抽象驅動程式:
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 資料庫文件,請在config/location.php
檔案中插入以下url
設定選項:
// 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>
並按照以下準則建構:
次要版本不會單獨維護,我們鼓勵您升級到下一個次要版本。
主要版本透過單獨的分支單獨維護。