İçeriğe atla
TubePress — ücretsiz, kendi sunucunda & aktif olarak geliştirilen
Geliştirici referansı

Modeller ve veritabanı

TubePress veri katmanı: model sınıfları, PDO Database yardımcısı, hazırlanmış ifadeler (prepared statements), veritabanı şeması ve sürümlenmiş SQL geçişleri (migration) açıklanıyor.

TubePress, MySQL/MariaDB ile iki ince katman aracılığıyla iletişim kurar: modeller (her varlık için bir statik sınıf) ve Database yardımcısı (PDO üzerinde küçük bir sarmalayıcı). Öğrenilecek bir ORM veya sorgu oluşturucu yoktur — yalnızca hazırlıklı ifadeler ve öngörülebilir metot adları.

Model katmanı

Her çekirdek varlığın src/Models/ dizininde statik metodlar sunan bir modeli bulunur. Mevcut modeller şunlardır: Video, Category, Tag, Performer, Channel, Comment, Page, User, Setting, Favorite, History, Report, ContactMessage, MenuConfig ve FooterConfig.

$video  = Video::find($id);            // one row (or null)
$latest = Video::all(['status' => 'published', 'limit' => 20]);
$id     = Video::create($data);        // returns new id
Video::update($id, ['title' => 'New title']);
Video::delete($id);

Modeller, kendi varlıklarına özgü birleştirmeleri ve filtreleri kapsüller — örneğin Video::find(), videoyu kategorileri, etiketleri, sanatçıları ve kanallarıyla birlikte döndürür; böylece denetleyiciler ve şablonlar sade kalır.

Database yardımcısı

Bir modelin kapsamadığı her şey için Database yardımcısını doğrudan kullanın. Her metot hazırlıklı ifadeler kullanır — kullanıcı girdisini asla SQL'e birleştirmeyin.

MetotDöndürürAmaç
Database::fetchOne($sql, $params)array\|nullİlk eşleşen satır.
Database::fetchAll($sql, $params)arrayTüm eşleşen satırlar.
Database::insert($table, $data)intİlişkisel bir dizi ekler; yeni kimliği döndürür.
Database::update($table, $data, $where, $whereParams)intGünceller; etkilenen satır sayısını döndürür.
Database::delete($table, $where, $params)intSiler; etkilenen satır sayısını döndürür.
Database::count($table, $where, $params)intSatır sayısı.
Database::query($sql, $params)PDOStatementTam kontrol için herhangi bir ifade.
Database::transaction($callback)mixedBir işlem içinde kapanış çalıştırır (otomatik commit/rollback).
$rows = Database::fetchAll(
    "SELECT * FROM videos WHERE status = ? ORDER BY id DESC LIMIT ?",
    ['published', 20]
);

$newId = Database::insert('categories', [
    'name' => 'Amateur',
    'slug' => 'amateur',
]);
Dayanıklı bağlantılar. Yardımcı utf8mb4, gerçek hazırlıklı ifadeler (emülasyon yok) ve istisna hata modunu kullanır; gerçek bir "server has gone away" hatası durumunda otomatik olarak bir kez yeniden bağlanır — böylece uzun süreli çalışan işçiler boştaki MySQL zaman aşımından etkilenmez.

İşlemler

Çok adımlı yazma işlemlerini tümünün başarılı olması veya tümünün geri alınması için sarmalayın:

Database::transaction(function () use ($videoId, $catIds) {
    Database::delete('video_categories', 'video_id = ?', [$videoId]);
    foreach ($catIds as $cid) {
        Database::insert('video_categories', [
            'video_id' => $videoId, 'category_id' => $cid,
        ]);
    }
});

Şema

Veritabanı temiz, normalleştirilmiş bir MySQL şeması kullanır. Temel tablolar şunları içerir: users, settings, categories, tags, performers, channels, videos ve birleştirme tabloları video_categories, video_tags, video_performers — ayrıca comments, user_favorites, user_history, video_likes, pages, plugins, themes ve migrations. İsteğe bağlı alt sistemler, etkinleştirdikçe kendi tablolarını ekler (içe aktarma işleri, medya depolamaları, dönüştürme işleri/sunucuları, reklam bölgeleri/noktaları, raporlar, besleme kaynakları, çeviri tabloları ve daha fazlası).

Geçişler

Şema değişiklikleri sql/ dizininde numaralı dosyalar olarak bulunur — 001_users.sql, 002_settings.sql, … — kurulum sırasında ve her güncellemeden sonra Migrator::run() tarafından sırayla uygulanır. Her geçiş kümülatiftir ve migrations tablosuna kaydedilir, böylece hiçbir zaman iki kez çalışmaz.

  • Şemayı bir eklentiden genişletmek için CREATE TABLE ifadelerinizi gönderin ve bunları eklentinin install() metodunda çalıştırın (bkz. Kancalar & eklentiler).
  • Uygulanmış bir geçişi hiçbir zaman yeniden numaralandırmayın veya düzenlemeyin — daha yüksek numaralı yeni bir tane ekleyin.

Model yazma

Bir model, tek bir tablo için Database yardımcısını sarmalayan statik bir sınıftan ibarettir:

class Promo
{
    public static function current(): ?array
    {
        return Database::fetchOne(
            "SELECT * FROM promos WHERE active = 1
             ORDER BY id DESC LIMIT 1"
        );
    }
}

Sonraki adımlar

Hâlâ takıldınız mı?

Kontrol panelinizden bir destek talebi açın, ekibimiz size yardımcı olacaktır.

Canlı demoyu deneyin → TubePress'i indirin →