Core/System/Registries — Sistem kayıt defteri (ad → sınıf haritası)
Doğrulanan kod tabanı:
d508f5e1(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:Core/System/Registries/— 8*.php(kök 3,RegistryMap/5).
Envanter: 8 dosyanın 8'i aşağıda anlatıldı.
1. Ne işe yarar, kim kullanır
Çatının "adı verilen şey hangi sınıf?" tablosudur. service('module'), model('master.projects'), helper('format') gibi çağrılar önce bu haritaya bakar (NamespaceResolver::find() → SystemRegistry::locate()); harita bulamazsa klasör taramasına düşülür (Discovery §3.1). Ayrıca takma ad (class_alias) ve CLI komut tablosunu taşır.
Harita beş özellik (trait) dosyasına bölünmüştür; SystemRegistry::registerMap() onları, proje bileşen haritasını ve modül/paket haritalarını array_merge_recursive ile birleştirir.
Kimler çağırır: NamespaceResolver (adı çözmek), ComponentRegistry aşaması (takma adlar), Routing aşaması (sovereignBundles()), ModuleDiscoveryDriver (sovereignBundles()), RbnSystemInfo, CLI (commands).
2. Klasör/dosya envanteri
| Dosya | Görev | Önemli public yöntemler |
|---|---|---|
SystemRegistry.php |
Ana kayıt: beş trait + DiscoveryConfigTrait (statik locate()); birleşik haritayı proje anahtarıyla önbellekler. |
static sovereignBundles(): array, registerMap(): array, static clearCache(), static locate(string $name, ?string $type = null): ?string (trait'ten) |
AppProjectRegistry.php |
Proje tarafı kayıt: keşfedilen modülleri (proje ayarındaki bundles listesiyle süzülmüş) ve ComponentTypes::PLURAL_MAP bileşenlerini haritaya ekler. |
bundles(): array, registerMap(): array |
RbnSystemInfo.php |
RbnSystemInfo::get('ADMIN_NAME') gibi marka/kimlik sabitlerini bulur. |
static get(string $key) |
RegistryMap/SystemAccessMapTrait.php |
aliases (4) ve commands (6). |
protected accessMap(): array |
RegistryMap/SystemLogicMapTrait.php |
managers (5), services (27), handlers (24), resolvers (2), jobs (3). |
protected logicMap(): array |
RegistryMap/SystemPhysicalMapTrait.php |
models (36), providers (6), repositories (23). |
protected physicalMap(): array |
RegistryMap/SystemRenderMapTrait.php |
Render katmanı: services (4), handlers (10), providers (10), presets (1), resolvers (10), clusters (1), renderAliases (panel/auth/crawler takma adları — bunlar PHP sınıf takma adı DEĞİLDİR; gerçek sınıf alias defteri aliases anahtarındadır, [FW-095]). |
protected renderMap(): array |
RegistryMap/SystemResourceMapTrait.php |
helpers (12), validations (6), constants (boş), metadata (3 önek). |
protected resourceMap(): array |
3. Akış
3.1 SystemRegistry::registerMap() (SystemRegistry.php:58)
- Proje anahtarı:
Bootstrap::getAppContext('project_key')→active_project_key()→'default'; bu anahtarla$mergedMapCachevarsa döner. array_merge_recursive:accessMap(),logicMap(),physicalMap(),AppProjectRegistry::registerMap(),resourceMap(),renderMap()(:67-74).BaseService::get()->service('module')varsaregisterBundles('map', sovereignBundles())veregisterBundles('map')sonuçları birleştirilir (:78-85).- Aktif denetleyicinin
moduleDataözelliği (sınıf adı ya da nesne)registerMap()taşıyorsa o da eklenir (:89-97). - Sonuç proje anahtarına göre önbelleğe alınır.
3.2 Ad bulma (locate, DiscoveryConfigTrait.php:30,97-148)
locateRegistry($ad,$tür) dört "kapıyı" sırayla dener: System (SystemRegistry), Project (AppProjectRegistry), RBN Framework (sovereignBundles() sınıfları), Module (yine SystemRegistry); her kapıda registerMap()[<tür çoğulu>] içinde searchDeep() ile anahtar (büyük/küçük harf duyarsız) ya da, dizin anahtarı sayısalsa sınıf dosya adı eşleşmesi aranır. Hiçbiri bulamazsa DiscoveryEngine::namespace()->find() (klasör taraması) çağrılır. $isLocating özyineleme koruması etkinse doğrudan taramaya gidilir.
3.3 Takma adlar (ComponentRegistry aşaması)
accessMap()['aliases']: BaseService → BaseService, Service; Config → Config; Paths → Paths; RbnSystemInfo → RbnSysInfo. ComponentRegistry::registerAliases() her biri için class_alias() yapar (özgün sınıf yoksa ya da takma ad zaten varsa atlar ve LogThrottle ile bir kez günlüğe yazar).
3.4 RbnSystemInfo::get($key) (RbnSystemInfo.php:24)
Anahtar büyük harfe çevrilir; önce FrameworkIdentity sabiti (FrameworkIdentity::<ANAHTAR>); yoksa metadata haritasındaki önek (ADMIN_, KIT_, SEO_) eşleşirse önek atılıp kalan, hedef sınıfta BaseConfig::data() ya da sınıf sabiti olarak aranır. Bulunamazsa null; her sonuç (null dahil) işlem içinde önbelleklenir.
4. Yapılandırma / içerik
sovereignBundles()(SystemRegistry.php:40): 7ModuleDatasınıfı —Packages\PackageData,Bundles\RbnSuite\{RbnAdmin,RbnAuth,RbnStudio}\Models\ModuleData,Bundles\Internal\{Backstage,Syshub,Webhub}\Models\ModuleData. Hepsi sınıf olarak mevcuttur.commands:db,make,migrate,system,version,tenant→Core\Services\Console\Handlers\*Handlers.AppProjectRegistry::bundles()projeninbundlesyönlendirme ayarını (getRouteConfig($projectKey,'bundles')) okur; liste doluysa yalnız o adlı modüller (küçük harf eşleşme) döner, boşsa keşfedilenlerin hepsi.- Haritadaki sınıf adları
Rbn\Framework\önekiz yazılır (Core\Services\…);NamespaceExpansionTrait::expandRegistryResult()öneki tamamlar.
5. Tuzaklar ve kurallar (ölçülmüş)
PHP 8.3 ile beş trait'in accessMap/logicMap/physicalMap/resourceMap/renderMap çıktısındaki 193 sınıf adı class_exists ile denendi (Windows):
| Sonuç | Sayı |
|---|---|
| Sınıfı bulunan | 188 |
| Sınıfı bulunamayan | 5 |
Bulunamayanlar (haritada var, kodda yok):
| Kayıt | Hedef | Durum |
|---|---|---|
logic.handlers['storage'] |
Core\System\Storage\Handlers\StorageHandler |
Core/System/Storage/ altında Handlers/ klasörü yok |
logic.handlers['localization'] |
Core\System\Localization\Handlers\LocalizationHandler |
Core/System/ altında Localization/ klasörü yok |
logic.handlers['seo'] |
Core\Render\Handlers\Seo\SeoHandler |
Render altında Handlers/Seo/ yok |
resource.metadata['KIT_'] |
Core\Render\Config\AssetConfig |
gerçek ad alanı Core\Render\Configs\AssetConfig (çoğul Configs) |
resource.metadata['SEO_'] |
Core\Render\Config\SeoConfig |
Core\Render\Config\ ad alanı yok |
Sonuçları: handler('storage'|'localization'|'seo') bugün locate()'ten sınıf döndürmez, klasör taramasına düşer ve bulamazsa null (zorunluysa tanılama) verir; RbnSystemInfo::get('KIT_…')/('SEO_…') her zaman null döner çünkü hedef sınıf yoktur (class_exists doğrulaması, RbnSystemInfo.php:60). Bu girdilerin silinmesi ya da doğru adlara çevrilmesi bir kod kararıdır (bu belge salt okunur).
Diğer kurallar:
- Çözüm sırası "kapı" sırasıdır:
System→Project→RBN Framework→Module; aynı ad birden çok haritada varsa ilk bulunan kazanır.array_merge_recursiveaynı dize anahtarı iki kez görürse değerleri diziye çevirir ([a, b]);checkRegistry()bu durumda son elemanı alır (end($found),DiscoveryConfigTrait.php:111) — sessiz "son kayıt kazanır" davranışı. - Harita proje başına önbelleklenir (
$mergedMapCache); yeni modül ekleninceSystemRegistry::clearCache()gerekir (yoksa istek boyunca eski harita kalır). models/repositoriesanahtarları noktalıdır (master.projects,common.ipBlock,project.user,app.rss.source);searchDeepanahtarı küçük harfe indirerek eşler, ama noktalı adı bölmez.- Birden çok ad aynı sınıfı gösterebilir (örn.
ipBlockvemaster.ipBlock→MasterIpBlocksModel;shieldSettingvecommon.shieldSetting→CmSysSettingsShieldModel). MasterRbnHeartbeatsModel(master.rbnHeartbeat) için haritanın dışında çağıran bulunamadı (Core/Bundles/Packages/Resourcestaraması,rbnHeartbeat/rbn_heartbeatgeçişleri yalnız model dosyalarında ve bu haritada). Modelrbn_heartbeatstablosunu bildirir;MasterDbData::REQUIRED_TABLESisez_sys_heartbeatsister; hangi tablonun gerçek master'da bulunduğu salt okunur ölçümle doğrulanamadı (bkz. acik-sorular).
6. Örnek (gerçek koddan)
// Core/System/Registries/RegistryMap/SystemAccessMapTrait.php:26-31
'aliases' => [
BaseService::class => ['BaseService', 'Service'],
Config::class => ['Config'],
Paths::class => ['Paths'],
RbnSystemInfo::class => ['RbnSysInfo'],
],
// Core/System/Registries/SystemRegistry.php:40-43 (ilk iki girdi)
public static function sovereignBundles(): array
{
return [ \Rbn\Framework\Packages\PackageData::class,
\Rbn\Framework\Bundles\RbnSuite\RbnAdmin\Models\ModuleData::class, /* … */ ];
}
7. İlgili belgeler
- Core/System genel bakış · Discovery · Kernel (
ComponentRegistry,Routing) - Support/Definitions (
ComponentTypes,FrameworkIdentity) - Açık sorular