Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce sisteminizde aşağıdaki araçların ve sürümlerin kurulu olduğundan emin olmalısınız. Modern PHP geliştirme süreçlerinde hata ayıklama ve performans yönetimi için bu standartlar şarttır.
- PHP 8.2 veya üzeri: Tip tanımlamaları (type hinting) ve performans iyileştirmeleri için gereklidir.
- Composer: Bağımlılık yönetimi için kullanılacaktır.
- Veritabanı: MySQL veya MariaDB (PDO sürücüsü ile).
- Geliştirme Ortamı: VS Code veya PHPStorm gibi bir IDE.
Veritabanı tarafında, kargo hareketlerini tutacağımız tabloyu oluşturarak işe başlayalım. Bu tablo, kargo durumlarını ve takip numaralarını dinamik olarak yönetmemizi sağlayacaktır.
CREATE TABLE kargo_takip (
id INT AUTO_INCREMENT PRIMARY KEY,
takip_no VARCHAR(50) NOT NULL UNIQUE,
durum VARCHAR(50) NOT NULL,
guncel_konum VARCHAR(100),
guncelleme_tarihi TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Nesne Yönelimli Mimariyi Tasarlama
Nesne yönelimli bir yapıda, her bir sorumluluğu ayrı bir sınıfa vermek (Single Responsibility Principle) en iyi pratiktir. Kargo sistemimiz için bir Kargo sınıfı ve bu kargonun işlemlerini yönetecek bir KargoYonetici sınıfı oluşturacağız.
Aşağıdaki kod örneğinde, temel Kargo sınıfımızı tanımlıyoruz. Bu sınıf, kargo verilerini tutan bir veri modeli (Data Model) görevi görecektir.
class Kargo {
public function __construct(
public string $takipNo,
public string $durum,
public string $konum
) {}
public function getBilgi(): string {
return "Takip No: {$this->takipNo} - Durum: {$this->durum} - Konum: {$this->konum}";
}
}
Veritabanı Bağlantısı ve PDO Kullanımı
Veritabanı işlemlerinde SQL Injection saldırılarına karşı korunmak için her zaman PDO (PHP Data Objects) ve hazırlanan ifadeleri (prepared statements) kullanmalısınız. Aşağıdaki sınıf, veritabanı bağlantımızı güvenli bir şekilde yönetecektir.
class Veritabani {
private PDO $pdo;
public function __construct() {
$dsn = "mysql:host=localhost;dbname=kargo_db;charset=utf8mb4";
$this->pdo = new PDO($dsn, 'kullanici', 'sifre', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
}
public function sorgula(string $sql, array $params = []) {
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt;
}
}
Dinamik Takip Sistemi İçin İş Mantığı
Şimdi, KargoYonetici sınıfı ile veritabanı ve kargo nesnelerimizi birleştirelim. Bu sınıf, dışarıdan gelen takip numarasına göre veritabanından sorgulama yapacak ve sonucu döndürecektir.
class KargoYonetici {
private Veritabani $db;
public function __construct(Veritabani $db) {
$this->db = $db;
}
public function takipEt(string $takipNo): ?Kargo {
$sql = "SELECT * FROM kargo_takip WHERE takip_no = :no";
$stmt = $this->db->sorgula($sql, ['no' => $takipNo]);
$row = $stmt->fetch();
if (!$row) return null;
return new Kargo($row['takip_no'], $row['durum'], $row['guncel_konum']);
}
}
Kargo Takip Yöntemlerinin Karşılaştırılması
Aşağıdaki tablo, kargo takip sistemlerinde kullanılan farklı yaklaşımların avantaj ve dezavantajlarını özetlemektedir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Statik Veritabanı | Hızlı ve kolay kurulum | Eski veriler için sürekli güncelleme gerekir |
| API Entegrasyonu | Gerçek zamanlı veri | Dış servise bağımlılık ve maliyet |
| Hibrit Yapı | Hızlı sorgu ve güncel veri | Karmaşık mimari |
Güvenlik ve Hata Ayıklama İpuçları
Kritik Uyarı: Üretim ortamında veritabanı şifrelerinizi asla kod içerisinde açıkça yazmayın. Bunun yerine .env dosyaları kullanın. Ayrıca, kullanıcıdan gelen her veriyi
htmlspecialchars()ile filtreleyerek XSS saldırılarına karşı önlem alın.
Sisteminizi test ederken, geçersiz takip numaraları için hata yönetimi (try-catch blokları) eklemeyi unutmayın. Hataları log dosyalarına yazmak, sistemin kararlılığını izlemenize yardımcı olur.
Sıkça Sorulan Sorular
API entegrasyonu neden gereklidir?
Kargo firmalarının kendi sistemlerindeki anlık konum değişikliklerini çekebilmek için API entegrasyonu şarttır. Kendi veritabanınızda sadece yerel bir kayıt tutarsınız.
SQL Injection nasıl engellenir?
Kullanıcıdan alınan verileri doğrudan SQL sorgusuna eklemek yerine, her zaman PDO'nun prepare() ve execute() metotlarını kullanarak parametreli sorgular oluşturmalısınız.
Bu yapı Laravel gibi frameworklere taşınabilir mi?
Evet, bu nesne yönelimli mimari, Laravel'in Service Container ve Repository yapısı ile oldukça uyumludur.
Performans için ne yapılabilir?
Sık sorgulanan takip numaraları için Redis gibi bir önbellekleme (caching) mekanizması kullanarak veritabanı yükünü azaltabilirsiniz.
Hangi veritabanı motoru daha iyidir?
Kargo takip sistemlerinde işlem yoğunluğu yüksek olduğu için InnoDB motorunu kullanmanız, veri bütünlüğü ve işlem güvenliği açısından önerilir.
Webhook Entegrasyonu ile Otomatik Durum Güncelleme
Kargo takip sisteminizin manuel sorgular yerine, kargo firmasından gelen anlık verilerle güncellenmesi, kullanıcı deneyimini ve sistem verimliliğini üst seviyeye taşır. Webhook yapısı, kargo durumu değiştiğinde firmanın sunucunuzdaki bir endpoint'e POST isteği göndermesi prensibiyle çalışır.
Webhook Dinleyici Endpoint Yapılandırması
Gelen veriyi işlemek için güvenli bir giriş noktası oluşturmalısınız. Aşağıdaki örnek, gelen JSON verisini doğrular ve veritabanındaki takip numarasını günceller:
Sistem Testleri ve Birim Testi (Unit Testing)
Geliştirdiğiniz nesne yönelimli yapının kararlılığını sağlamak için PHPUnit gibi araçlarla birim testleri yazmanız kritik öneme sahiptir. Özellikle kargo durum hesaplamaları gibi kritik fonksiyonlarda hata payını sıfıra indirmek için test senaryoları oluşturun.
Örnek Test Senaryosu
Aşağıdaki kod bloğu, kargo durumunun doğru formatta dönüp dönmediğini kontrol eden basit bir test sınıfı örneğidir:
use PHPUnit\Framework\TestCase;
class CargoManagerTest extends TestCase {
public function testStatusUpdateReturnsBoolean() {
$dbMock = $this->createMock(PDO::class);
$manager = new CargoManager($dbMock);
$result = $manager->updateStatus('TR123456789', 'Teslim Edildi');
$this->assertIsBool($result);
}
}
Profesyonel İpucu: Test süreçlerinde gerçek veritabanınızı kullanmak yerine, "Mock" nesneler kullanarak veritabanı işlemlerini simüle edin. Bu, testlerinizin çok daha hızlı çalışmasını sağlar ve veritabanı kirliliğini önler.
Deployment ve Sunucu Optimizasyonu
Sisteminizi canlıya alırken dikkat etmeniz gereken en önemli husus, sunucu tarafındaki zaman aşımı (timeout) süreleridir. Kargo firmalarından gelen yoğun veri trafiğini yönetmek için:
- Queue (Kuyruk) Yapısı: Gelen Webhook verilerini doğrudan veritabanına yazmak yerine Redis veya RabbitMQ gibi bir kuyruk sistemine atarak işleyin.
- Loglama: Her gelen isteği ve oluşan hataları
error_logveya özel bir tabloya kaydederek takip edin. - SSL/TLS: Webhook iletişiminin güvenliği için sunucunuzda mutlaka geçerli bir SSL sertifikası bulundurun.
Sonuç
PHP ile nesne yönelimli yapıda dinamik bir kargo takip sistemi kurmak, projenizin ölçeklenebilirliği için attığınız en büyük adımdır. Bu rehberde öğrendiğiniz sınıfları, veritabanı katmanlarını ve güvenlik prensiplerini uygulayarak, profesyonel standartlarda bir takip modülü geliştirebilirsiniz.
Bir sonraki adım olarak, kargo firmalarından gelen Webhook bildirimlerini dinleyen bir API endpoint'i oluşturarak sisteminizi tamamen otomatize edebilirsiniz. Kodunuzun güvenliği ve veritabanı bütünlüğü için her zaman modern standartları takip etmeyi ihmal etmeyin.


Yorumlar (0)
Yorum Yaz