RBN Core - Framework v0.9.7 76 belge

Bundles/Internal/Syshub/DbConsole — Veritabanı konsolu, SQL terminali, tablo gezgini

Doğrulanan kod tabanı: d49b4413 (dal feat/fw-license-master) · Tarih: 2026-10-05 · Yayın: 0.9.7 = bu commit + sonrası; belge yalnız doğrulama anındaki kodu anlatır
Kaynak klasör: Bundles/Internal/Syshub/Controllers/DbConsole/ (3 *.php) +
Handlers/SyshubDbConsoleHandler.php + Providers/SyshubDbConsoleProvider.php +
Services/SyshubDbConsoleService.php + 4 görünüm.
Envanter: 3 controller dosyasının 3'ü anlatıldı.

1. Ne işe yarar, kimler kullanır

Veritabanını panelden yönetir: DB özeti (tablo sayısı/boyut/kayıt),
SQL terminali (tek ifadeli ham SQL), tablo gezgini (satır görüntüleme,
silme, collation değiştirme, tablo düşürme, SQL/CSV/ZIP dışa aktarma),
toplu işlemler ve temiz kurulum.

Kimler çağırır: geliştirici paneli (syshub/dbconsole/*,
ModuleData.php:87). Veri katmanı schemaDoctor modelidir
(Core\Database\Models\SchemaDoctorModel.php).

2. Klasör/dosya envanteri

2.1 Controllers/DbConsole/ (3)

Dosya Görev Önemli public yöntemler
DbConsoleController.php #[SubModule(entity:'database', service:'dbConsole')]. DB özeti ekranı ve dört sistem eylemi. index(): void (:23), seedAdmin(): void (:37), cleanInstall(): void (:46), optimize(): void (:55), convertAllCollations(): void (:64)
SqlConsoleController.php Aynı SubModule kimliği, farklı controller. SQL terminali; index() ayrıca @fw/RbnCommon/css/rbn-terminal.css varlığını hazırlar (:27). index(): void (:23), executeQuery(): void (:40), getDatabaseInfo(): void (:54), getTableList(): void (:66), getTableData(): void (:78)
TableExplorerController.php Tablo listesi, satır gezme, satır/tablo silme, dışa aktarma (ayrı .sql dosyaları veya tek ZIP). index(): void (:23), browse(): void (:42), changeCollation(): void (:67), deleteRow(): void (:81), bulkDeleteRows(): void (:95), bulkExportRows(): void (:109), dropTable(): void (:125), bulkDropTables(): void (:135), exportSQL(): void (:151), bulkExportSQL(): void (:168), bulkExportZip(): void (:189)

2.2 Zincirin geri kalanı

Dosya Görev
Handlers/SyshubDbConsoleHandler.php Tüm yıkıcı DB eylemleri ve güvenlik kapıları (isRawSqlRole, hasMultipleStatements, maskForAudit)
Providers/SyshubDbConsoleProvider.php Salt okuma keşfi: getInfo/getTables/getRows/getMetadata
Services/SyshubDbConsoleService.php 12 düz proxy; seedAdmin() → service('masterAccount')->seedAdmin() (:86)
Views/DbConsole/index.rbn.php DB özet kartları
Views/DbConsole/console.rbn.php Terminal arayüzü + gömülü JS (RbnSqlConsole nesnesi, :193)
Views/DbConsole/tables.rbn.php Tablo listesi + arama + sayfalama
Views/DbConsole/browse.rbn.php Satır tablosu + kolon başlıkları

3. Akış — SQL terminali ve tablo gezgini

POST syshub/dbconsole/console/execute
  → SqlConsoleController::executeQuery()            SqlConsoleController.php:40
      → request->form(['query'=>'required|string'], ['action'=>'sql_console_execute'])  :41-43
      → SyshubDbConsoleService::executeQuery()        :46
          → handler('syshubDbConsole')                ModuleData.php:37
          → SyshubDbConsoleHandler::executeQuery()    :23
              ├─ rol kapısı      isRawSqlRole()       :31 / :68
              ├─ tek ifade       hasMultipleStatements()  :42 / :81
              ├─ denetim         auditSql()           :47 / :200
              └─ model('schemaDoctor')->executeRaw()  :50
      → Route->handleResult($result)                  :48

GET syshub/dbconsole/tables
  → TableExplorerController::index()                  :23
      → service->getTables()  ⇒ provider->getTables() ⇒ schemaDoctor->getTableStatus()
      → paginate($allTables, 15)                       :29
      → render('DbConsole/tables', [tables, database_info, total, search, pagination])  :31-39

POST syshub/dbconsole/tables/bulk-export-zip
  → TableExplorerController::bulkExportZip()          :189
      → her tablo için exportSql($name)  ⇒ prepareTempZip()  :193-194
      → respondDownload($file, …)                     :195

4. Yapılandırma / ayar anahtarları ve sabitler

Öğe Yer Değer Not
CLEANUP_ALLOWED_TABLES Definition::get('database_project', 'CLEANUP_ALLOWED_TABLES') — cleanInstall() yalnız bu listedeki tabloları truncate eder (SyshubDbConsoleHandler.php:239). Liste boşsa hiçbir şey yapılmaz, metot yine true döner.
Hedef collation DbConsoleController::convertAllCollations() utf8mb4_unicode_ci changeCollation('*', …) — joker tablo adı modele bırakılır (DbConsoleController.php:65)
LIMIT (hızlı tablo verisi) SqlConsoleController::getTableData() 100 Sabit kodlu, istenemez (:78)
getRows() varsayılanı SyshubDbConsoleProvider::getRows() 100 TableExplorerController::browse() bu varsayılanı kullanır, sonra elle sayfalar (TableExplorerController.php:46)
Dışa aktarma başlığı SyshubDbConsoleHandler::exportSql() -- RBN Framework SQL Export DROP TABLE IF EXISTS + şema + INSERT'ler; değerler $pdo->quote() ile kaçırılır (:284-296)
Terminal asset SqlConsoleController::index() @fw/RbnCommon/css/rbn-terminal.css Panel kontekstinde hazırlanır (:27)

5. Tuzaklar ve kurallar

  1. '*' tablo adı bir sözleşmedir. convertAllCollations() changeCollation('*', …) çağırır;
    jokerin convertCollation() içinde yorumlanması modele bağlıdır. SyshubDbConsoleHandler::optimize()
    ise joker kullanmaz — array_column($provider->getTables(), 'name') ile açık tablo listesi alır (:224).
  2. bulkExportSQL ve bulkExportZip ayrı uçlar, aynı rota grubu. ModuleData.php:118
    kebab-case yollar (bulk-export-sql, bulk-export-zip, bulk-drop-tables) kayıt eder; diğer
    toplu uçlar camelCase'dir (bulkDeleteRows). Görünüm hangisine post ediyorsa o çalışır.
  3. Geçici dosya yazımı diske gider. prepareTempFile() / prepareTempZip() çıktıyı bir geçici
    dosyaya yazar, respondDownload() onu indirir. bulkExportSQL() her tablo için ayrı indirme
    URL'si üretip respondMultiDownload() ile toplu tetikler (:176-181) — tarayıcı çoklu indirme
    izni isteyebilir.
  4. Görünüm değişkeni uyuşmazlığı (browse.rbn.php). Controller items, table_metadata,
    primary_key gönderir (TableExplorerController.php:52) ama görünüm $records, $columns,
    $page, $limit bekler (browse.rbn.php:5, kullanım :92,103,109-111). $records/$columns
    tanımsız değişken olarak okunur; bu yüzden tablo gövdesi boş kalır.
  5. getTableData() tablo adını doğrulamaz. "SELECT * FROM `{$form['table']}` LIMIT 100"
    (SqlConsoleController.php:78) — required|string yeterli; adres/kaçış kontrolü yok, sorgu
    executeQuery()'den geçerken yalnız "tek ifade" kuralı uygulanır.
  6. prepareTempFile() dosya adı girdiden gelir. bulkExportRows() dosya adını
    "{$form['table']}_rows_" . date('Ymd_His') . ".sql" olarak kurar (:114); tablo adı
    yol ayırıcı içerirse beklenmedik dizin oluşabilir.
  7. cleanInstall() başarısızlığı bildirmez. Döngüde truncateTable() dönüş değeri denetlenmez
    (SyshubDbConsoleHandler.php:241), metot koşulsuz true döner.
  8. Aynı SubModule kimliği üç controller'da. entity: 'database', service: 'dbConsole' üçünde
    de aynı (DbConsoleController.php:14, SqlConsoleController.php:14, TableExplorerController.php:14).
    Keşif alias'ı (SyshubService::dbConsole()) tekildir; ayrım yalnız rotadan gelir.

6. Örnek (gerçek koddan)

// Bundles/Internal/Syshub/Handlers/SyshubDbConsoleHandler.php:236-249
public function cleanInstall(): bool
{
    $model   = $this->model('schemaDoctor');
    $tables  = Definition::get('database_project', 'CLEANUP_ALLOWED_TABLES') ?? [];

    foreach ($tables as $t) {
        $model->truncateTable($t);
    }

    return true;
}
// Bundles/Internal/Syshub/Controllers/DbConsole/TableExplorerController.php:189-196
$form  = $this->request->form(['ids' => 'required|array']);
$files = [];

foreach ($form['ids'] as $name) {
    $files[$name . '.sql'] = $this->service->exportSql($name);
}

$file = $this->service->prepareTempZip('db_pack_' . date('Ymd_His') . '.zip', $files);
$this->respondDownload($file, 'Seçili tablolar ZIP arşivi içinde hazırlandı.');

7. İlgili belgeler