NEXT-GEN CONTENT MANAGEMENT FRAMEWORK

CPalius CMF

Bir İçerik Yönetim Sisteminden
"Kurşun Geçirmez" Kurumsal Uygulama Framework'üne

Modern web ekosisteminde hazır eklenti sistemleriyle donatılmış ama hantal CMS'ler ile her şeye sıfırdan başlamayı gerektiren saf framework'ler arasındaki köprüyü kuran, dünya standartlarında optimize, güvenli ve genişletilebilir altyapı.

PHP 8.2+ Symfony 7.4 LTS Doctrine ORM AssetMapper Açık Kaynak

Teori, Pratik ve "Tekerleği Yeniden İcat Etme" Sancısı

Modern web geliştirmede her yeni proje, iki ucu keskin bir bıçağın üzerinde başlar. CPalius bu iki dünya arasındaki boşluğu doldurmak için doğdu.

Mevcut Sorunlar

Klasik CMS'ler (WordPress, Drupal)

Hazır eklenti ve tema sistemleriyle donatılmış ancak hantal veritabanı şemaları, teknik borç dağları ve güvenlik zaafiyetleriyle boğuşan yapılar.

Saf Framework'ler (Symfony, Laravel)

Her projede auth, ACL, dosya yönetimi ve admin paneli gibi temel bileşenleri sıfırdan yazarak zaman kaybettiren yaklaşım.

Sıfırdan MVC Romantizmi

Kendi framework'ünü yazmak kulağa romantik gelse de güvenlik (CSRF, XSS, SQLi), DI Container ve HTTP katmanı gibi devasa bir "görünmez buzdağı" barındırır.

CPalius Çözümü

Dünya Standartlarında Altyapı

Symfony 7.4 LTS'nin kanıtlanmış güvenlik ve performans altyapısı üzerine inşa edilmiş, teknik borçtan arınmış mimari.

Hazır Kurumsal Bileşenler

Auth, ACL, dosya yönetimi, çok dilli yapı ve admin paneli gibi temel bileşenler ilk günden çekirdekte. Tekerleği yeniden icat etmeye son.

Modüler ve Genişletilebilir

CMS'ten öte bir uygulama platformu: Oto Galeri, Turizm Acentası, CRM/ERP — hepsi aynı altyapı üzerinde çalışır.

Çökmeyen Çekirdek

Kullanıcı modüllerinden gelen hatalar sistemi asla çökertmez. 3 kademeli aktif savunma ve karantina hattı.

"Pristine Root" ve Klasör Mimarisi

Standart bir Symfony projesinde üçüncü parti paketler ve tarifler yüklendikçe ana dizin dosya çöplüğüne döner. CPalius, "Tertemiz Ana Dizin" politikasını benimsedi.

pristine-root
CPalius/
│
├── cp-core/          # KERNEL & SYSTEM SPACE
│   ├── bin/          # Konsol komut aracı
│   ├── config/       # Core konfigürasyonları
│   ├── migrations/   # Veritabanı göç dosyaları
│   ├── src/          # PHP sınıfları (App\\)
│   └── var/          # Cache, log, SQLite
│
├── cp-includes/      # DEPENDENCIES SPACE
│   └── vendor/       # Composer paketleri
│
├── cp-content/       # USER & DEVELOPER SPACE
│   ├── config/       # Config Sync alanı
│   ├── modules/      # Bağımsız modüller
│   ├── themes/       # UI temaları
│   └── translations/ # Çeviriler (tr, en)
│
├── public/           # WEB ROOT
│   ├── index.php     # Front Controller
│   └── assets/       # Frontend varlıkları
│
├── .env
└── composer.json
cp-core/ Kernel & System Space

Çekirdek PHP sınıfları, konfigürasyonlar, konsol araçları ve veritabanı göç dosyaları. Symfony Flex tariflerinin doğrudan bu alana kurulması garanti altındadır.

cp-includes/ Dependencies Space

Composer paketleri ve Symfony kütüphaneleri bu izole alanda tutulur. vendor-dir yeniden yapılandırılmıştır.

cp-content/ User & Developer Space

Modüller, temalar, çeviriler ve Config Sync alanı. Geliştiricinin kendi kodları ile framework sistem dosyaları asla birbirine karışmaz.

public/ Web Root

Dışarıya açık tek klasör. Front Controller (index.php) ve derlenmiş frontend varlıkları burada yer alır. Güvenlik sınırı.

"Core Never Dies" — Çökmeyen Çekirdek Mimarisi

Kullanıcı alanından gelebilecek kötü yazılmış veya bozuk kodların tüm sistemi kilitlemesini engelleyen Üç Kademeli Aktif Savunma ve Karantina Hattı.

1
1. Savunma Hattı

Tavuk-Yumurta Probleminin Çözümü

Symfony boot edilirken config/bundles.php dosyası okunur. Bu aşamada henüz veritabanı bağlantısı, servis konteyneri veya autoloader tam olarak ayağa kalkmamıştır. Modüllerin aktiflik durumunu doğrudan veritabanından okumaya çalışırsak, sistem daha boot edilemeden kilitlenir.

Çözüm: CPalius, bir modül aktif/pasif edildiğinde active_modules.php adında statik, PHP opcache dostu bir dizi dosyası üretir. bundles.php sadece bu dosyayı okur — veritabanına hiç dokunmaz.

cp-core/config/bundles.php
// Çekirdek her zaman ayakta
$bundles = [
    FrameworkBundle::class => ['all' => true],
    TwigBundle::class      => ['all' => true],
    DoctrineBundle::class  => ['all' => true],
    CoreBundle::class      => ['all' => true],
];

// Aktif modülleri dosyadan oku
$activeModules = require 'active_modules.php';
foreach ($activeModules as $moduleClass) {
    if (class_exists($moduleClass)) {
        $bundles[$moduleClass] = ['all' => true];
    }
}
2
2. Savunma Hattı

Çalışma Zamanı İzolasyonu

Sınıfın fiziksel olarak var olması (class_exists), o modülün kodunun hatasız çalıştığı anlamına gelmez. Modülün boot() metodu içinde fırlatacağı bir TypeError veya RuntimeException tüm sistemi çökertebilir.

Çözüm: Kernel::boot() metodu override edilerek modül seviyesindeki tüm boot süreçleri try/catch (\Throwable) zırhıyla kuşatıldı. Hatalı modül otomatik karantinaya alınır, çekirdek çalışmaya devam eder.

3
3. Savunma Hattı

Compile-Time Kilitlenme Koruması & Dry-Run

Eklentideki geçersiz bir YAML sözdizimi veya yanlış bir DI tanımı, Symfony container'ı derlenemez hale getirir. Bu durumda terminalde komut bile çalıştırılamaz.

Çözüm: Modül aktive edilmeden önce symfony/process ile izole bir alt süreç başlatılır. Bu süreçte cache:clearlint:yamllint:container komutları koşturulur. Hata varsa aktivasyon iptal edilir ve modül kalıcı olarak karantinaya alınır. Dosya asla bozuk haliyle kaydedilmez.

4
Yeni — 4. Savunma Hattı

İzole Route Yükleyicisi

Standart Symfony'de bir modülün routes.yaml dosyasındaki syntax hatası tüm sistemi çökertir.

Çözüm: SafeModuleRouteLoader her modülün rotasını izole bir try/catch bloğunda yükler. Hatalı modül atlanır ancak sistemin geri kalanı %100 ayakta kalır.

Veri Modeli ve Platform Yetenekleri

Hibrit veri modeli, yüksek performanslı indeksleme ve çok dilli yapı — tümü ilk günden çekirdeğin hücrelerine işlenmiştir.

Hibrit Veri Modeli

Sık sorgulanan temel alanlar (ID, Başlık, Slug, Durum) gerçek sütunlarda; dinamik, esnek alanlar (gövde, SEO, galeri) tek bir JSON sütununda. EAV'ın JOIN cehenneminden ve WordPress'in meta karmaşasından kurtulun.

Flat Field Index Motoru

JSON verilerini veritabanı bağımsız sorgulayın. NodeFieldIndex tablosu ve Doctrine Event Listener ile tip-uygun kolonlara sahip indeks tablosu. SQLite, MySQL ve Postgres'te aynı DQL çalışır.

Çok Dilli Yapı (i18n)

Çoklu dil ilk günden çekirdeğe işlendi. Kompozit benzersizlik kısıtları ile UNIQUE(slug, locale) ve UNIQUE(translation_group_id, locale) güvencesi. Dil sonradan eklenen bir cila değildir.

Config Sync Sistemi

Drupal'ın config sync yaklaşımı, Symfony TreeBuilder ile birleştirildi. Roller ve yetenek matrisleri YAML dosyalarında tutulur, Git ile taşınır. Kullanıcı verileri ise veritabanında kalır.

Modüler Bundle Mimarisi

Her modül bağımsız bir Symfony Bundle olarak çalışır. Kendi routes, services, templates ve migrations dosyalarına sahiptir. Modules\\ namespace'i ile tam izolasyon.

Zero Node.js Politikası

Geliştirici ve admin panelinde AssetMapper + Standalone Tailwind CSS kullanılır. Node.js bağımlılığı sıfır. Derleme adımı yok, doğrudan geliştirme — doğrudan deploy.

Core-Level XSS Sanitization

Manifesto Law 5.3 gereği, RichTextSanitizer ile veritabanına kaydedilecek her zengin metin çekirdek seviyesinde sterilize edilir.

Dinamik Semantic SEO

Hibrit JSON tabanlı verilerden SchemaOrgBuilder aracılığıyla otomatik olarak JSON-LD (Schema.org) üretimi (BlogPosting, WebPage).

Otonom Event-Driven Topoloji

YAGNI prensibini çiğnemeden inşa edilen, asenkron ve decoupling odaklı reaktif haberleşme omurgası. Katmanlar arası bağımlılıklar ve hook tetikleyicileri (event subscribers), "Golden Ratio" hassasiyetinde orantılanarak minimize edilmiştir.

Kanıtlanmış Temeller Üzerine İnşa

PHP 8.2+

Çekirdek Dil

Symfony 7.4 LTS

Framework Temeli

Doctrine ORM

Veritabanı Katmanı

AssetMapper

Frontend Varlıkları

Tailwind CSS

Standalone Binary

İki Sınıf Varlık: Content vs Business

CPalius sadece bir CMS değildir; arkasında Oto Galeri, Turizm Acentası, Personel Yönetimi veya CRM/ERP sistemlerinin çalışabileceği esnek bir uygulama platformudur.

Özellik Content Entities (Node) Business Records (Resource)
Kavramsal Karşılık Sayfa, Yazı, İlan Vitrini, Blog Araç, Fatura, Rezervasyon, Personel
Slug Var — SEO dostu URL üretimi Yok — İç yönetim kaydı
Çoklu Dil Var — translation_group_id ile Yok — Tek dilli kayıt
Yayın Durumu Var — draft / published / archived Yok — Durum makinesi (workflow)
SEO Var — Meta bilgileri JSON data içinde Yok — Herkese açık değil
Ortak Payda Aynı Capability modeli, aynı Twig bileşenleri, aynı CLI yönetimi, aynı Config Sync

#[CpResource] Devrimi

Geliştiricinin iş süreçlerini kodlamasını saniyeler seviyesine indirmek için özel bir PHP Attribute yapısı tasarlandı. Tek bir anotasyon ile veritabanındaki ham bir Doctrine sınıfını platformun tüm güçleriyle birleştiriyoruz.

Bu tek nitelik sayesinde:

  • Rol ve yetenek matrisine dinamik yetenekler otomatik kaydolur
  • Otomatik CRUD formları ve liste ekranları dinamik türetilir
  • SaaS çoklu kiracı izolasyonu otomatik uygulanır
  • Tüm değişiklikler sürüm geçmişine (audit log) kaydedilir
Örnek: Vehicle Entity
#[CpResource(
    name: 'vehicle',
    module: 'oto-galeri',
    capabilities: [
        'create','edit',
        'delete','view'
    ],
    auditable: true,
    multiTenant: true,
    workflow: 'vehicle_lifecycle'
)]
#[ORM\Entity]
class Vehicle
{
    private ?int $id;
    private ?string $plate;
    private ?string $brand;
    private ?int $price;
}

Platform Genişletilebilirlik Katmanı

Whitepaper'ın ilk sürümünden bu yana çekirdeğe dört yeni genişletme omurgası eklendi: REST API Gateway, izole Hook Sistemi, birleşik Cron/Otomasyon Motoru ve Modülden bağımsız Plugin katmanı. Her biri aynı "Core Never Dies" zırhını taşır.

REST API Gateway

Tek bir /api/{path} joker route'u, #[CpApi] attribute'lu servis metotlarını derleme zamanında (ApiRegistrationPass) eşleştirir. Kimlik doğrulama X-CP-API-KEY header'ı ile fail-closed çalışır — anahtar geçersizse hedef metot hiç çağrılmaz. Her endpoint kendi try/catch zırhında izole edilir; çöken bir uç yalnızca kendini etkiler.

İzole Hook Sistemi

Cotonti tarzı flat-file Hooks/{hook_point}.php dosyaları izole bir Closure içinde çalışır — dış scope'a değişken sızıntısı imkansızdır. Symfony tarzı #[CpHook] attribute'lu servisler ise HookRegistrationPass ile toplanır. Çöken hook sayfayı asla 500'e düşürmez, karantina günlüğüne yazılır.

Birleşik Cron / Otomasyon Motoru

CronManager üç paralel kaynağı — veritabanındaki cp_cron_jobs, #[CpCronJob] işaretli servisler ve flat-file Hooks/cron.{job}.php dosyalarını — tek listede birleştirir. Görevler CronCommandWhitelist ile yalnızca cp:* önekli komutlara izin veren izole alt-süreçlerde çalıştırılır.

Modülden Bağımsız Plugin Katmanı

Modüllerden ayrı ikinci bir genişletme noktası: PluginInterface işaretli servisler PluginRegistry tarafından toplanır, aktiflik durumu PluginToggleRepository ile veritabanında tutulur. Bir modül kendi içinde widget/sidebar gibi opsiyonel alt-özellikleri, modülün kendisinden bağımsız açıp kapatabilir.

DBAL Middleware Seviyesinde N+1 Muhafızı

Whitepaper'da kavram olarak duyurulan N+1 koruması artık gerçek bir Doctrine DBAL Middleware zincirinde çalışıyor: QueryCounterConnection, Driver, Statement ve TableParser birlikte, tablo bazlı sorgu sayacı tutar ve limiti aşınca MaxQueriesExceededException fırlatır.

Async Kuyruk Altyapısı (Hazırlık)

symfony/messenger paketi kurulu ve AACP Sistem Monitörü'nde durumu görünür durumda. Gelecekteki e-posta, bildirim ve toplu işlem kuyrukları için temel şimdiden atıldı; henüz aktif bir transport bağlanmadı.

Lazy-Load Ayar Motoru

#[CpSetting] ile yönetilen ve veritabanından sadece talep edildiğinde tek bir sorguyla çekilen ayar altyapısı (SettingsRegistry). Performans bütçesine sadıktır.

AACP — Admin Kontrol Paneli

Whitepaper'ın roadmap bölümünde vaat edilen Safe Mode / Kurtarma Konsolu artık gerçek: veritabanı tamamen çökse dahi ayakta kalan, token tabanlı bir kurtarma arayüzü dahil, AACP tam bir sistem yönetim merkezine dönüştü.

Tamamlandı — Manifesto Law 2.3

Safe Mode & Kurtarma Konsolu

/aacp/recovery ucu security.yaml'da bilinçli olarak herkese açık (PUBLIC_ACCESS) bırakılmıştır; yetkilendirmeyi kendisi .env'deki AACP_RECOVERY_TOKEN ile hash_equals() (timing-safe) karşılaştırması yapar. Hiç Doctrine sorgusu çalıştırmaz — veritabanı tamamen çökmüşken bile devrededir. Token boşsa kapı tamamen kapalıdır (fail-safe).

Yeni

Canlı Sistem Monitörü

/aacp/system ve /aacp/system/metrics JSON ucu; load average, memory, OPcache hit-rate, veritabanı bağlantı durumu ve Messenger kuyruk durumunu htop tarzı canlı olarak raporlar. Kurulu olmayan bileşenler için dürüstçe "kurulu değil" bilgisi döner.

Yeni

Karantina Ekranı & Cache Rebuild Konsolu

/aacp/quarantinemodule_quarantine.log dosyasını okuyup listeleyen salt-okunur panel. /aacp/system/cache-rebuild/* ise Symfony cache, OPcache reset ve Tailwind asset rebuild işlemlerini aynı CSRF token'ı paylaşan üç ayrı AJAX ucu üzerinden tetikler.

Yeni

Lokalizasyon Paneli & Performans Yönetimi

TranslationManager, çekirdek ve tüm modüllerin messages+intl-icu.{tr,en}.yaml dosyalarını web üzerinden düzenlemeyi, atomik dosya yazma garantisiyle (.tmp + rename()) sağlar. Ayrı bir Performans Yönetimi ekranı ise Redis, Memcached, Varnish ve Nginx PageSpeed için canlı bağlantı testleri çalıştırır — "aktif" bayrağı yalnızca test başarılıysa set edilir.

API Anahtarı Yönetimi

REST Gateway için anahtar üretimi ve yaşam döngüsü yönetimi.

Cron Yönetimi

DB + attribute + flat-file kaynaklı görevlerin birleşik listesi.

Hook Gezgini

Tüm kanca noktalarını ve bağlı dinleyicileri keşfeden panel.

Dil (Locale) Yönetimi

Aktif/pasif/varsayılan dil ayarları, tek doğruluk kaynağı.

İlk Parti Modüller: Platformun Kanıtı

Blog, Medya ve Menü modülleri, platformun her genişletme noktasını (API, Hook, Cron, Plugin, Settings) uçtan uca kullanan referans implementasyonlardır.

Blog Modülü

Node::type='post' üzerine kurulu tam blog sistemi. Kategori/etiket yönetimi, zamanlanmış yayınlama (PublishScheduledPostsTask), GET /api/blog/posts REST ucu, sidebar hook'u ve Schema.org (BlogPosting) JSON-LD üretimi bir arada.

Media Modülü

AssetManager ve bağımsız Asset entity'si üzerine kurulu medya kütüphanesi + görsel seçici (picker) admin arayüzü. Flysystem depolama katmanı üzerinde sha256 tabanlı deduplikasyon.

Menu Modülü

WordPress tarzı sürükle-bırak benzeri frontend menü yönetimi. Menu/MenuItem entity'leri, soft-delete uyumu için Node'a gevşek referansla (FK değil) bağlanır.

Güvenlik ve Performans Anayasası

Güvenlik ve performans, projenin son aşamasında "üzerine eklenen" bir cila değildir; sistemin en temel yapı taşlarıdır.

Yetenek Tabanlı Erişim Kontrolü (CBAC)

Standart ROLE_ADMIN yaklaşımı yerine dinamik olarak üretilen yetenekler kontrol edilir. Kodun hiçbir yerinde rol ismi kontrol edilmez.

denyAccessUnlessGranted('system.module.manage')

Roller = Config (YAML): Git ile taşınır.
Kullanıcılar = Content (DB): Asla dışa aktarılmaz.

SaaS Tenant Sızıntı Koruması

Çok kiracılı (SaaS) sistemlerde en büyük güvenlik açığı: yazılımcının WHERE tenant_id = ? yazmayı unutması.

CPalius'ta bu ihtimal platform seviyesinde yok edilmiştir. Doctrine SQLFilter otomatik olarak her sorguya tenant kısıtını enjekte eder. Geliştiricinin müdahalesine gerek kalmaz.

N+1 Sorgu Muhafızı

Veritabanı yavaşlıklarının en yaygın sebebi olan N+1 sorgu hatalarını engelleyen Doctrine Listener. Dev ortamında tetiklenir.

Tek HTTP isteğinde aynı tabloya atılan sorgu sayısı limiti aşarsa MaxQueriesExceededException fırlatılır. Geliştirici bu hatayı lokalde çözmeden kodu canlıya alamaz.

Voter-to-SQL Dönüşümü

Liste ekranlarındaki PHP tabanlı Voter kontrollerini (N+1 bellek krizini) ortadan kaldıran QueryScopeApplier.

Kullanıcının .own veya .any yetenekleri, sorgu veritabanına gitmeden önce doğrudan Doctrine QueryBuilder üzerinden SQL WHERE koşuluna çevrilir.

Zero-Trust Payload Validasyonu

Dış dünyadan gelen hiçbir HTTP yüküne (payload) güvenmeyen strict-type DTO (Data Transfer Object) mimarisi. Veriler denetleyicilere (controllers) ulaşmadan önce Symfony Validator ile otonom olarak sterilize edilir.

Kötü niyetli manipülasyon girişimleri anında reddedilerek çekirdeğin bütünlüğü "Golden Ratio" kusursuzluğunda korunur.

Lock-Free Yüksek Eşzamanlılık

Geleneksel sistemlerdeki tablo kilitleme (table-lock) krizlerini tarihe gömen Optimistic Locking omurgası. Aynı anda gerçekleşen binlerce veri mutasyonu, atomik transaksiyonlarla deadlock olmadan izole edilir.

YAGNI felsefesiyle karmaşadan arındırılan bu altyapı, sunucu darboğazlarını (bottleneck) saf donanımsal limitlere kadar erteler.

Teknik Manifesto

CPalius CMF'in kurumsal omurgasını oluşturan 5 temel mimari prensip ve kod seviyesindeki derin özellikleri.

Blok 1: Hibrit Veri Mimarisi ve Flat-Field Index Motoru

Two-Class Entity ve JSON-Relational Hibrit Yapı: Geleneksel CMS'lerdeki hantal EAV (Entity-Attribute-Value) yapısını tamamen reddeden CPalius, alanları iki ayrı sınıfta yönetir. İş kayıtları (#[CpResource]) kesin strict-tip SQL kolonlarında tutulurken, içerik kayıtları (Node) esnekliği sağlamak adına tüm dinamik verilerini tek bir JSON kolonunda saklar.

Performans Dehası (Flat-Field Index Motoru): JSON kolonlarında WHERE koşulu ile arama yapmak yavaş olduğu için, CPalius Doctrine Event Listener tabanlı otonom bir düzleştirme (flattening) motoru kullanır. queryable: true işaretli alanlar node_field_index tablosuna yansıtılır. ProcessWire'dan ilham alan findNodesBySelector API'si ile karmaşık sorgular basitleşir.


// Süper Akıcı (Fluent) Selector API Kullanımı
$nodes = $nodeRepository->findNodesBySelector(
    'type=post, status=published, is_featured=1, limit=5, sort=createdAt:desc'
);

// Arka Planda Çalışan Flat-Field Motoru Kesiti
// JSON'daki dinamik 'is_featured' alanı, indeks tablosundaki 'value_int' üzerinden çok yüksek hızda JOIN'lenir.
                    

Blok 2: Askeri Düzeyde İzolasyon ve Sandbox Katmanı

Core Never Dies (Çökmeyen Çekirdek): Kullanıcı alanı (cp-content/modules) ile çekirdek (cp-core) arasına devasa bir izolasyon katmanı örülmüştür. Üçüncü parti hatalı bir modül tüm uygulamayı çökertemez.

Karantina Zırhı ve Acil Durum Vanası: Modül aktif edilirken symfony/process üzerinden izole bir alt süreçte lint:container ve lint:yaml testleri koşturulur. Çalışma anında ise giriş kapıları try/catch kalkanıyla donatılmıştır. Çöken modül anında yoksayılıp module_quarantine.log dosyasına yazılır.


// ApiGatewayController'daki Gerçek Zamanlı Karantina İzolasyonu
try {
    $service = $this->serviceLocator->get($serviceId);
    $result = $service->$methodName($request, ...$endpoint['pathParameters']);
    
    return $result instanceof JsonResponse ? $result : new JsonResponse($result);
} catch (\Throwable $e) {
    // Çöken modül tüm sistemi 500'e düşürmez. 
    // İzole edilip loglanır, Gateway ayakta kalmaya devam eder.
    $this->quarantineApiFailure($serviceId, $methodName, $e);
    
    return new JsonResponse(['error' => 'Internal API Error'], 500);
}
                    

Blok 3: Deep-Localization ve Dinamik Compiler-Pass

Kurumsal Çoklu Dil Topolojisi: Dil desteği çekirdeğin parçasıdır. Her içerik dikey bir tablo satırı (Node) olarak üretilir ve translationGroupId UUID'si ile birbirine bağlanır. DB katmanında fiziksel olarak korunur.

Plug-and-Play Çeviri Derlemesi: Modüller kendi çevirilerini kendi dizinlerinde barındırır. TranslationFileLocator bunları bulur ve Symfony Compiler Pass ile framework.translator.paths dizisine enjekte eder. Çeviriler atomik yazma algoritmasıyla diske işlenir.


// TranslationManager İçerisindeki Atomik Dosya Yazma Garantisi
$dir = dirname($filePath);
if (!is_dir($dir)) {
    $this->filesystem->mkdir($dir);
}

// 1. Önce .tmp uzantılı geçici bir dosyaya güvenlice yazılır
$yaml = Yaml::dump($data, 2, 2);
$tmpPath = $filePath . '.tmp-' . bin2hex(random_bytes(4));
$this->filesystem->dumpFile($tmpPath, $yaml);

// 2. İşletim sistemi seviyesindeki rename() ile hedef dosya anında ezilir.
// Elektrik dahi kesilse dosya asla yarım/bozuk kalamaz (Atomicity).
$this->filesystem->rename($tmpPath, $filePath, true);
                    

Blok 4: Hibrit Otomasyon ve Cron Motoru

Birleşik Cron Altyapısı: Eski tip veritabanı cronları ile modern mimari birleşmiştir. #[CpCronJob] özniteliği ile sanal görevler veya Hooks/cron.*.php dosyaları oluşturulabilir.

İzole Tetikleme ve Sistem Gözetimi: CronManager görevleri izole alt süreçler halinde (Process) çalıştırarak memory leak'leri önler. Yöneticiler /aacp/cron siber-konsolu üzerinden görevleri canlı izleyebilir ve "Şimdi Çalıştır" AJAX sinyalleriyle tetikleyebilir.


// cp-content/modules/Blog/Cron/PublishScheduledPostsTask.php
final class PublishScheduledPostsTask
{
    public function __construct(
        private readonly EntityManagerInterface $entityManager,
        private readonly NodeRepository $nodeRepository,
    ) {}

    // Hiçbir DB kaydına ihtiyaç duymadan, saf öznitelik tabanlı Cron Kaydı
    #[CpCronJob(schedule: '*/5 * * * *', name: 'blog.publish_scheduled')]
    public function execute(): string
    {
        $dueNodes = $this->nodeRepository->findDueScheduledNodes();

        if ($dueNodes === []) {
            return 'Yayın zamanı gelmiş içerik yok.';
        }

        foreach ($dueNodes as $node) {
            $node->publish($node->getPublishedAt());
        }
        $this->entityManager->flush();

        return sprintf("%d içerik yayına alındı.", count($dueNodes));
    }
}
                    

Blok 5: Modüler REST API ve Güvenlik Geçidi (Gateway)

Routing Karmaşasına Son: Modül geliştiricileri routing dosyaları yerine metodun üzerine #[CpApi] özniteliğini koyarak uç nokta açar. ApiGatewayController üzerinden merkezi olarak yönetilir.

Kriptografik Güvenlik Omurgası: X-CP-API-KEY başlığı cp_settings üzerinden kontrol edilir. ApiKeyService, zamanlama saldırısı (timing attack) korumalı hash_equals fonksiyonuyla SHA-256 doğrulamasını yapar.


// 1. Modül İçerisindeki Tertemiz Uç Nokta
#[CpApi(path: '/blog/posts', methods: ['GET'], public: false)]
public function getPosts(Request $request): JsonResponse 
{
    // İş mantığı...
}

// 2. ApiGatewayController'daki Fail-Closed Zırhı
// public:false olan rotalarda API Anahtarı eksikse hedef metot KESİNLİKLE çağrılmaz.
if (!$endpoint['definition']['public'] && !$this->hasValidApiKey($request)) {
    return new JsonResponse(['error' => 'Unauthorized'], Response::HTTP_UNAUTHORIZED);
}
                    
0
Savunma Hattı
0
N+1 Sorgu Toleransı
0
Genişletme Katmanı
Modül Kapasitesi
0
Açık Kaynak

Gelecek Yol Haritası

İlk whitepaper'da vaat edilen üç maddeden Safe Mode tamamlandı, Asset Sistemi kısmen tamamlandı. Sıradaki geliştirme sprintlerinde aşağıdaki sistemler inşa edilecek.

Sprint 1

Workflow & State Machine

Fatura, araç, rezervasyon gibi iş kayıtlarının geçiş süreçlerini (draft → preparation → sold) YAML tanımlarıyla yöneten ve her geçişi otomatik audit log'a bağlayan mekanizma. CpResource::$workflow alanı zaten deklare edilmiş durumda — sıradaki adım gerçek transition/guard motorunu bağlamak.

Sprint 2

LiipImagineBundle Entegrasyonu

Flysystem tabanlı Asset katmanı hazır; sırada URL üzerinden anlık görsel türetme (resize/crop/thumbnail pipeline) için LiipImagineBundle entegrasyonu var.

Sprint 3

Somut Resource & Audit Log

#[CpResource] altyapısı (registry, capability üretimi, multiTenant/auditable bayrakları) tamamen hazır ama henüz hiçbir concrete entity kullanmıyor. Sıradaki adım: ilk Business Record örneği (örn. Vehicle) ve gerçek bir AuditLog tablosuna bağlanması.

Sprint 4

Messenger Async Kuyruk

symfony/messenger kurulu ve AACP Sistem Monitörü'nde izlenebiliyor; sıradaki adım gerçek bir transport (Doctrine/Redis) bağlayıp e-posta ve bildirim işlemlerini asenkron kuyruğa taşımak.

Mimariyi Birlikte Kusursuzlaştıralım

CPalius, topluluğun gücüyle en sağlam uygulama framework'üne dönüşecek. Fikirlerinizi, eleştirilerinizi ve mimari önerilerinizi heyecanla bekliyoruz.