다양한 서비스(온라인 및 로컬)를 사용하여 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를 폴백 드라이버로 설정하는 것이 좋습니다.
자신의 서버에서 사용자 위치를 검색하도록 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에서 위치 드라이버는 이제 location:update
명령을 사용하여 업데이트할 수 있는 Updatable
인터페이스를 구현할 수 있습니다. 현재 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>
그리고 다음 지침에 따라 구성되었습니다.
마이너 버전은 개별적으로 유지 관리되지 않으므로 다음 마이너 버전으로 업그레이드하는 것이 좋습니다.
주요 버전은 별도의 분기를 통해 개별적으로 유지 관리됩니다.