Gereksinimler ve Ön Hazırlık
Laravel projenizde konum entegrasyonuna başlamadan önce sisteminizin hazır olduğundan emin olmalısınız. Konum verileri genellikle hassas veriler kategorisine girer, bu nedenle uygulama güvenliğine dikkat etmeliyiz.
- Laravel 11+ yüklü bir proje ortamı.
- Veritabanı yönetimi için MySQL veya PostgreSQL.
- Tarayıcı tabanlı konum erişimi için HTTPS protokolü (Geolocaton API, yerel sunucularda bile HTTPS gerektirir).
- Leaflet.js kütüphanesi (Harita görselleştirme için).
Öncelikle, kullanıcı verilerini tutacağımız tabloyu hazırlayalım. Kullanıcının konumunu saklamak için users tablosuna veya ayrı bir user_locations tablosuna latitude ve longitude sütunlarını eklememiz gerekir.
// Migration dosyası örneği
Schema::table('users', function (Blueprint $table) {
$table->decimal('latitude', 10, 8)->nullable();
$table->decimal('longitude', 11, 8)->nullable();
});
Adım 1: Kullanıcı Konumunu Tarayıcıdan Alma
Kullanıcının mevcut konumunu almanın en yaygın yolu, JavaScript'in navigator.geolocation API'sini kullanmaktır. Bu yöntem, kullanıcıdan tarayıcı üzerinden izin ister ve onaylandığında enlem/boylam bilgilerini döndürür.
// resources/js/app.js
function getUserLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(sendPositionToServer, showError);
} else {
console.error("Tarayıcınız konum servislerini desteklemiyor.");
}
}
function sendPositionToServer(position) {
const lat = position.coords.latitude;
const lng = position.coords.longitude;
// Laravel rotasına AJAX ile gönderim
fetch('/update-location', {
method: 'POST',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'Content-Type': 'application/json'
},
body: JSON.stringify({ latitude: lat, longitude: lng })
});
}
Adım 2: Konum Verisini Laravel'de İşleme
JavaScript tarafından gönderilen verileri Laravel tarafında karşılamalı ve veritabanına kaydetmeliyiz. Burada Request nesnesini kullanarak verileri doğrulamalı (validation) ve SQL Injection saldırılarına karşı korumalıyız.
// app/Http/Controllers/LocationController.php
public function update(Request $request) {
$validated = $request->validate([
'latitude' => 'required|numeric',
'longitude' => 'required|numeric',
]);
$user = auth()->user();
$user->update([
'latitude' => $validated['latitude'],
'longitude' => $validated['longitude']
]);
return response()->json(['message' => 'Konum başarıyla güncellendi.']);
}
Adım 3: Harita Entegrasyonu ve Leaflet.js Kullanımı
Veritabanında sakladığımız konumları harita üzerinde göstermek için Leaflet.js kütüphanesini kullanacağız. Bu kütüphane hafif ve genişletilebilir bir yapı sunar. Harita katmanı olarak OpenStreetMap verilerini kullanabiliriz.
// resources/views/map.blade.php
var map = L.map('map').setView([{{ $user->latitude }}, {{ $user->longitude }}], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap'
}).addTo(map);
L.marker([{{ $user->latitude }}, {{ $user->longitude }}]).addTo(map)
.bindPopup('Buradasınız.')
.openPopup();
Adım 4: Konum Verilerinin Karşılaştırmalı Analizi
Konum verilerini işlerken farklı yöntemler kullanabilirsiniz. Aşağıdaki tablo, yaygın yaklaşımların avantaj ve dezavantajlarını özetlemektedir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Tarayıcı API (Client-side) | Hızlı, kullanıcı odaklı | Kullanıcı izni gerektirir |
| IP Tabanlı (Server-side) | İzin gerektirmez | Düşük hassasiyet |
| GPS Donanımı (Mobil) | Çok yüksek hassasiyet | Pil tüketimi yüksek |
Kritik Güvenlik Uyarısı: Kullanıcı konum verileri kişisel veri (KVKK/GDPR) kapsamına girer. Bu verileri asla açık metin olarak saklamayın, gereksiz verileri düzenli olarak silin ve veritabanı erişimlerini sınırlandırın.
Adım 5: Dinamik Güncellemeler İçin Laravel Echo Kullanımı
Eğer uygulamanızda birden fazla kullanıcının konumunu gerçek zamanlı olarak harita üzerinde görmek istiyorsanız, Laravel Echo ve WebSockets (Pusher veya Reverb) kullanmalısınız. Bu, haritanın sayfa yenilenmeden güncellenmesini sağlar.
// app/Events/LocationUpdated.php
class LocationUpdated implements ShouldBroadcast {
public $user;
public function __construct($user) {
$this->user = $user;
}
public function broadcastOn() {
return new Channel('map-channel');
}
}
Sıkça Sorulan Sorular
Konum doğruluğu nasıl artırılır?
Tarayıcı API'sinde enableHighAccuracy: true parametresini kullanarak GPS sinyallerine öncelik verebilirsiniz, ancak bu işlem pil tüketimini artıracaktır.
Neden harita görüntülenmiyor?
Genellikle bir CSS çakışması veya JavaScript kütüphanesinin yüklenmemesinden kaynaklanır. Tarayıcı konsolunu (F12) kontrol ederek "L is not defined" hatası olup olmadığına bakın.
İnternet bağlantısı koptuğunda ne olur?
Konum verilerini yerel depolamada (LocalStorage) tutabilir ve bağlantı geldiğinde sunucuya senkronize edebilirsiniz.
Laravel ile Google Maps kullanabilir miyim?
Evet, ancak Google Maps API ücretli bir servistir. Leaflet.js ücretsiz ve açık kaynaklı bir alternatif sunar.
Konum verilerini ne kadar süre saklamalıyım?
Kullanım amacınıza göre değişir. Eğer bir "son görülen konum" özelliği ise, yeni veri geldiğinde eski verinin üzerine yazılması (update) en verimli yöntemdir.
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka güvenlik testlerini yapın ve güncel Laravel güvenlik dokümantasyonunu inceleyin.
Mesafe Tabanlı Sorgulama: Haversine Formülü ile Yakındaki Kullanıcıları Bulma
Konum verilerini veritabanında sakladıktan sonra, bir kullanıcının çevresindeki diğer kullanıcıları veya noktaları listelemek için "Haversine" formülünü kullanmak en yaygın yöntemdir. Laravel'in selectRaw metodunu kullanarak, SQL sorgusu içerisinde dünya üzerindeki iki nokta arasındaki kuş uçuşu mesafeyi hesaplayabiliriz.
Aşağıdaki örnekte, belirli bir koordinata 5 kilometre mesafedeki kullanıcıları getiren bir sorgu yapısını inceleyebilirsiniz:
$latitude = $request->lat;
$longitude = $request->lng;
$radius = 5; // Kilometre cinsinden
$nearbyUsers = User::selectRaw("id, name, latitude, longitude,
( 6371 * acos( cos( radians(?) ) *
cos( radians( latitude ) )
* cos( radians( longitude ) - radians(?) )
+ sin( radians(?) ) * sin( radians( latitude ) ) )
) AS distance", [$latitude, $longitude, $latitude])
->having("distance", "
Sonuç
Laravel ile dinamik konum ve harita entegrasyonu, doğru araçlar ve güvenlik prensipleriyle oldukça verimli bir süreçtir. Bu rehberde, tarayıcıdan konum almayı, bunu Laravel controller'ları ile işlemeyi ve Leaflet.js ile harita üzerinde görselleştirmeyi öğrendiniz. Bir sonraki adım olarak, veritabanınızdaki konum verilerini kullanarak "yakınımdaki kullanıcılar" veya "yakınımdaki işletmeler" gibi mesafe tabanlı sorgular (Haversine formülü) üzerine çalışabilirsiniz.

Yorumlar (0)
Yorum Yaz