RBN Core - Framework v0.9.7 76 belge

Core/Render/Configs — sabit tanım dosyaları (5 dosya)

Doğrulanan kod tabanı: c23b431f · 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: Core/Render/Configs/ — 5 *.php.
Envanter: 5 dosyanın 5'i anlatıldı.
Doğrulama platformu: Windows + PHP 8.3, tüm sabitler reflection/erişimle ölçüldü.

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

Beş BaseConfig türevi, Render katmanının derleme zamanı sabitlerini tutar:
asset vekili kurulumu, view yönerge eşlemesi, robots kuralları, SEO varsayılanları,
breadcrumb sözlüğü. Hepsinin tek ortak yanı statiktir — örnek üretilmez,
$service->config(...) ile okunmaz, doğrudan Sınıf::SABİT çağrısıdır.

Kimler kullanır: ViewEngine (ViewConfig), AssetBuilder (AssetConfig),
AssetController (AssetConfig), SystemGuardHandler (AssetConfig),
RobotsResolver (RobotsConfig), SeoResolver/SeoBuilder (SeoConfig),
BreadcrumbResolver/BreadcrumbBuilder (BreadcrumbConfig).

Tuzak: Dizin adı Configs (çoğul). Kayıt haritasında iki yerde tekil
Config yazılmıştır: SystemResourceMapTrait içinde
resource.metadata['KIT_'] => 'Core\Render\Config\AssetConfig' ve
'SEO_' => 'Core\Render\Config\SeoConfig' — bu iki yol gerçek değil
(System/Registries.md §5 §5.3'te ölçülmüştür).

2. Klasör/dosya envanteri (5/5)

Dosya Görev Sabitler / yöntemler
AssetConfig.php (91) Varlık vekili kurulumu, küme kaydı, proxy host beyaz listesi, uzantı→grup haritası. NAME='RbnKit', VERSION='1.0', PROXY_SETUP, CLUSTER_REGISTRY, PROXY_ALLOWED_HOSTS, EXTENSION_MAP
ViewConfig.php (51) View yönerge eşlemesi (10 yönerge). Yapısal yönergeler ViewEngine'de. static directives(): array
RobotsConfig.php robots.txt kuralları: disallow listeleri, izinli yollar, dosya boyutu sınırı, Google özel tarayıcı belirteçleri. NAME='RbnRobots', VERSION='1.0', MAX_BYTES=512000, SPECIAL_CRAWLERS, ROBOTS_DISALLOWS, SYSTEM_DISALLOWS, CORE_DISALLOWS, ASSET_DISALLOWS, ALLOWED_PATHS
SeoConfig.php (45) SEO varsayılanları ve marka görselleri (data-URI SVG). NAME='RbnSeo', VERSION='1.3', SLOGAN, OG_IMAGE, LOGO_SVG, static defaults(): array
BreadcrumbConfig.php (83) Kırıntı sözlüğü: gizlenen alan adları, aksiyon→ikon/etiket haritası, terminal aksiyonlar. NAME_BLACKLIST, ACTION_ICON_MAP, TERMINAL_ACTIONS

3. AssetConfig — ölçülen değerler (AssetConfig.php)

PROXY_SETUP anahtarları            = ['version','project','framework']
PROXY_SETUP['version']             = '1.0'
PROXY_SETUP['project']             = {"path":"project-assets","token":"@project/"}
PROXY_SETUP['framework']           = {"path":"framework-assets","token":"@fw/"}
PROXY_ALLOWED_HOSTS                = []            ← BOŞ (dış CDN kullanımı için elle eklenmeli)
CLUSTER_REGISTRY anahtarları        = ['core','project','kit']
  core    => ['label'=>'Core',    'folder'=>'']
  project => ['label'=>'Project', 'folder'=>null]     ← null = Public Root referansı
  kit     => ['label'=>'RbnKit',  'folder'=>'RbnKit']
EXTENSION_MAP = css→css, js→js, mjs→js, less→css, scss→css,
                png→image, jpg→image, svg→image, json→data

PROXY_SETUP doğrudan HTML'e yansır: View::result() :193-194 bu değerlerden
/project-assets/ ve /framework-assets/ öneklerini alıp normalizeHtmlUrls()
'a verir.

4. RobotsConfig — robots.txt sabitleri

Kaynak: E:\localhost\docs\google-arama\robots-txt.md, araclar-ve-botlar\google-tarayicilari.md, adsense\ads-txt.md.

  • MAX_BYTES = 512000 — robots.txt 500 KiB altında kalır (Google fazlasını yok sayar); CrawlerProvider::renderRobots() aşılırsa LengthException fırlatır.
  • SPECIAL_CRAWLERS = ['AdsBot-Google','AdsBot-Google-Mobile','Mediapartners-Google','APIs-Google'] — bu tarayıcılar * grubunu yok sayar; her biri * ile AYNI kuralları taşıyan kendi grubunu alır (geliştirme/staging'de Disallow: /).
  • ALLOWED_PATHS /ads.txt içerir: ads.txt hiçbir grupta engellenmez. Framework ads.txt ÜRETMEZ; dosya içeriği yayıncının AdSense hesabındaki öneriden alınır ve alan adı kökünde yayınlanır.
  • Crawl-delay yazılmaz (Google desteklemez; Bing ve Yandex için de değer yazılmaz). Önceki BOT_RULES ve DEFAULT_CONFIG (crawl_delay, cms_version vb.) kaldırıldı.
  • Docs tablosunda olmayan bot belirteci yazılmaz; yapay zeka botları (OAI-SearchBot, GPTBot, PerplexityBot, ClaudeBot, Google-Extended) için framework ayrı grup YAZMAZ, karar site sahibinindir ve * kuralları bu botların içerik yollarını engellemez.

5. BreadcrumbConfig — ölçülen değerler (BreadcrumbConfig.php)

TERMINAL_ACTIONS = ["view","show","preview","download"] (:77).
Bu liste, aksiyon adı bunlardan biriyse kırıntının son adım olduğunu
belirler (alt sayfa üretilmez).

NAME_BLACKLIST (17 alan, :17):
id, parent_id, user_id, created_at, updated_at, deleted_at, slug, is_active, status, type, order, sort, hit_count, password, token, csrf_token, remember_token, view_source

Güvenlik açısından önemli: password, token, csrf_token, remember_token
listedir → kırıntı etiketi olarak asla basılmaz. Bu, BreadcrumbResolver'ın
normalizeIcon()/build() akışındaki ilk savunmadır (veritabanı sütun
adlarından etiket üretildiği için).

ACTION_ICON_MAP — 27 aksiyon, her biri {icon, label}:
index, logs, log, edit, update, delete, remove, create, add, view, show, settings, config, list, search, history, stats, analytics, report, users, profile, developer, unread, read, trash, group, manage, wizard
Örnekler: edit => {icon:'bi bi-pencil-square', label:'Düzenle'},
trash => {icon:'bi bi-trash', label:'Çöp Kutusu'}.

Tuzak: İkonlar Bootstrap Icons sınıflarıdır (bi bi-*). AssetBuilder
panel/auth bağlamında bootstrap_icons'ı atlar (Builders.md §5.5) — yani
panel/auth'ta kırıntı ikonları stil olarak yüklü değildir, ikon yerine boş
kutu çizilir. Bu, iki katmanın birbirinden habersiz kararıdır.

6. ViewConfig::directives() — 10 yönerge (tam liste)

Ölçüldü: count(ViewConfig::directives()) = 10.

README §3.4 tablosunda birebir karşılaştırmalı liste var. Özet:

Yönerge Kaynak
@hasrole / @endhasrole ViewConfig.php:28
@csrfToken, @csrf, @method('…') :32-34
@sys('…') :37
@path(…), @import(…) :43-44
@php / @endphp :47-48

Güvenlik notu (kod yorumu :40-42): @import → ViewEngine::import() →
path() + compile(); iki katman da kök sınırı kontrolü yapar, yani
@import('../../evil.php') require edilemeden reddedilir.

Yapısal yönergeler ViewConfig'te DEĞİLDİR: @if/@elseif/@else/@endif,
@foreach/@endforeach, @for/@endfor, @extends/@section/@endsection/@yield
→ ViewEngine::parseDirectives() içinde sabit dizi (ViewEngine.php:216),
ViewConfig::directives() bunlara array_merge ile eklenir (:236-237).
Sonuç: ViewConfig'i düzenlemek yeni yönerge ekler; yapısal yönergeleri
değiştirmek için ViewEngine düzenlenmelidir.

7. Tuzaklar ve kurallar

  1. ViewConfig::directives() her çağrıda yeni dizi kurar (:23-49) —
    sabit dizi değil. ViewEngine bunu bir kez çağırıp
    self::$cachedDirectives içinde saklar (ViewEngine.php:236), yani
    ViewConfig'i çalışma zamanında değiştirmek ViewEngine önbelleğini
    geçersiz kılmaz.
  2. @csrf ve @csrfToken ViewHelperTrait DNA'sına bağlıdır
    (ViewConfig.php:31 yorumu) — csrfToken()/csrfField() metotları view
    nesnesinde yoksa derleme çalışma zamanında fatal verir. Bu metotlar
    BaseManager/BaseController public listesinde ölçüldü (csrfToken,
    csrfField, csrfMeta, methodField — hepsi public). View BaseRender
    → BaseComponent → BaseContextTrait zinciri üzerinden erişir.
  3. PROXY_ALLOWED_HOSTS boş olduğu için dış CDN 404 verir
    (Controllers.md §3.1, ölçüldü).
  4. SeoConfig::OG_IMAGE ve LOGO_SVG data-URI SVG'dir (:23, :26) —
    dosya sistemi bağımlılığı yoktur, ama < karakteri ham yazılmıştır;
    htmlspecialchars uygulayan bir katmandan geçerse bozulur. Ölçüldü: değerler
    data:image/svg+xml,<svg …> biçiminde, &quot; yok (ham tırnak).
  5. CLUSTER_REGISTRY['project']['folder'] = null (:47) — "Public Root
    referansı" anlamına gelir; AssetBuilder bu anahtarı kullanmaz, null
    değer strtolower(null) gibi bir yerde çağrılırsa PHP 8.3'te deprecated
    uyarısı
    verir (kodda bu yol ölçülmedi).

8. Örnek (gerçek koddan)

// Core/Render/Configs/AssetConfig.php:24-34
public const PROXY_SETUP = [
    'version' => self::VERSION,
    'project' => [
        'path' => 'project-assets',
        'token' => '@project/'
    ],
    'framework' => [
        'path' => 'framework-assets',
        'token' => '@fw/'
    ]
];
// Core/Render/View.php:189-202  (sabitler doğrudan HTML'e yansır)
$setup = AssetConfig::PROXY_SETUP;
$source = in_array($this->type, ['framework','core'], true) ? 'framework' : 'project';
$proxyPath  = $setup[$source]['path'] ?? 'project-assets';
$prPrefix   = '/' . ($setup['project']['path']   ?? 'project-assets') . '/';
$fwPrefix   = '/' . ($setup['framework']['path'] ?? 'framework-assets') . '/';
return $this->renderedHtml = $this->normalizeHtmlUrls($html, null, [
    'pr_prefix' => $prPrefix, 'fw_prefix' => $fwPrefix,
    'proxy_path' => $proxyPath, 'media_prefix' => '/media/'
]);

9. İlgili belgeler