Bundles/Internal/Syshub/DbConsole — Veritabanı konsolu, SQL terminali, tablo gezgini
Doğrulanan kod tabanı:
d49b4413(dalfeat/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
'*'tablo adı bir sözleşmedir.convertAllCollations()changeCollation('*', …)çağırır;
jokerinconvertCollation()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).bulkExportSQLvebulkExportZipayrı 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.- 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 üretiprespondMultiDownload()ile toplu tetikler (:176-181) — tarayıcı çoklu indirme
izni isteyebilir. - Görünüm değişkeni uyuşmazlığı (
browse.rbn.php). Controlleritems,table_metadata,
primary_keygönderir (TableExplorerController.php:52) ama görünüm$records,$columns,
$page,$limitbekler (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. getTableData()tablo adını doğrulamaz."SELECT * FROM `{$form['table']}` LIMIT 100"
(SqlConsoleController.php:78) —required|stringyeterli; adres/kaçış kontrolü yok, sorgu
executeQuery()'den geçerken yalnız "tek ifade" kuralı uygulanır.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.cleanInstall()başarısızlığı bildirmez. DöngüdetruncateTable()dönüş değeri denetlenmez
(SyshubDbConsoleHandler.php:241), metot koşulsuztruedöner.- Aynı
SubModulekimliğ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
- Syshub/README.md — modül haritası, kayıt haritası, tuzak 10 (SQL rol kapısı)
- Core/Database/Engine.md —
executeRaw,getTableStatus - kavramlar/03-veritabani-ve-kiracilik.md
- acik-sorular.md