Ambil lokasi pengunjung dari alamat IP mereka menggunakan berbagai layanan (online & lokal).
Instal lokasi menggunakan composer require
:
composer require stevebauman/location
Publikasikan file konfigurasi (ini akan membuat file location.php
di dalam direktori config
):
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.
}
Penting :
- Metode ini mengambil alamat IP pengguna melalui
request()->ip()
.- Dalam konfigurasi default,
testing.enabled
aktif, alamat IP yang dikembalikan berada di AS. Nonaktifkan untuk mendapatkan alamat IP asli klien.
$ position = Location:: get ( ' 192.168.1.1 ' );
Anda dapat memanggil Location::fake
dengan serangkaian pola alamat IP dan posisinya yang diharapkan untuk memalsukan lokasi alamat 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
Jika mau, Anda dapat menggunakan tanda bintang untuk mengembalikan posisi yang sama untuk alamat IP mana pun yang diberikan:
Location:: fake ([
' * ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
])
]);
$ position = Location:: get ( $ anyIpAddress ); // Position
Jika tidak ada ekspektasi yang diberikan, atau ekspektasi tidak sesuai, Location::get
akan mengembalikan false
:
Location:: fake ();
Location:: get ( $ anyIpAddress ); // false
Jika aplikasi Anda mencoba mengambil lokasi beberapa alamat IP, Anda dapat memberikan beberapa pola ekspektasi alamat IP:
Location:: fake ([
' 127.0.0.1 ' => Position:: make ([
' countryName ' => ' United States ' ,
' countryCode ' => ' US ' ,
// ...
]),
' 192.168.1.1 ' => Position:: make ([
' countryName ' => ' Canada ' ,
' countryCode ' => ' CA ' ,
// ...
]),
]);
Driver yang tersedia:
Dianjurkan untuk mengatur MaxMind sebagai driver cadangan menggunakan database lokal sehingga beberapa informasi lokasi dikembalikan jika mencapai batas kecepatan dari layanan web eksternal.
Untuk mengatur MaxMind agar mengambil lokasi pengguna dari server Anda sendiri, Anda harus:
.env
Anda menggunakan kunci MAXMIND_LICENSE_KEY
php artisan location:update
untuk mengunduh file .mmdb
terbaru ke direktori database/maxmind
AndaCatatan : Perlu diingat, Anda harus memperbarui file ini dengan menjalankan
location:update
secara rutin untuk mengambil informasi terkini dari pengunjung Anda.
Di file konfigurasi, Anda dapat menentukan driver cadangan sebanyak yang Anda inginkan. Dianjurkan untuk mengkonfigurasi driver MaxMind dengan file .mmdb
database lokal (disebutkan di atas), sehingga Anda selalu mengambil beberapa informasi lokasi umum dari pengunjung.
Jika terjadi pengecualian saat mencoba mengambil driver (seperti kesalahan 400/500 jika API penyedia berubah), maka secara otomatis akan menggunakan driver berikutnya.
Untuk membuat driver Anda sendiri, cukup buat kelas di aplikasi Anda, dan perluas Driver abstrak:
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 ;
}
}
Kemudian, masukkan nama kelas driver Anda ke dalam file konfigurasi:
// config/location.php
' driver ' => App Location Drivers MyDriver::class,
Di versi 7, basis kode telah diperbarui dengan tipe PHP yang ketat, persyaratan versi PHP dan Laravel yang diperbarui, struktur Driver
yang diperbarui, serta sedikit penambahan konfigurasi.
Di versi 7, driver lokasi sekarang dapat mengimplementasikan antarmuka Updatable
yang memungkinkan driver tersebut diperbarui menggunakan perintah location:update
. Saat ini, hanya driver MaxMind yang mendukung hal ini.
Untuk mengupdate file konfigurasi Anda agar dapat mendownload file database MaxMind terbaru secara otomatis, masukkan opsi konfigurasi url
di bawah ini ke file config/location.php
Anda:
// 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')),
],
],
];
Setelah selesai, Anda dapat menjalankan perintah artisan di bawah ini untuk mengunduh file .mmdb
terbaru:
php artisan location:update
Di versi 7, basis kode telah diperbarui dengan tipe PHP yang ketat, persyaratan versi PHP dan Laravel yang diperbarui, dan struktur Driver
yang diperbarui.
Jika Anda telah membuat implementasi driver khusus Anda sendiri, Anda harus memperbaruinya untuk menggunakan kelas Driver
dasar atau HttpDriver
.
Jika Anda mengambil lokasi menggunakan layanan HTTP, mungkin berguna untuk memperluas HttpDriver
untuk mengurangi kode yang perlu Anda tulis:
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;
}
}
Lokasi sebisa mungkin dibuat berdasarkan pedoman Pembuatan Versi Semantik.
Rilisan akan diberi nomor dengan format sebagai berikut:
<major>.<minor>.<patch>
Dan dibangun dengan pedoman sebagai berikut:
Versi minor tidak dikelola secara individual, dan Anda dianjurkan untuk meningkatkan ke versi minor berikutnya.
Versi utama dikelola secara individual melalui cabang terpisah.