NEXT-GEN CONTENT MANAGEMENT FRAMEWORK
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ı.
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.
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.
Her projede auth, ACL, dosya yönetimi ve admin paneli gibi temel bileşenleri sıfırdan yazarak zaman kaybettiren yaklaşım.
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.
Symfony 7.4 LTS'nin kanıtlanmış güvenlik ve performans altyapısı üzerine inşa edilmiş, teknik borçtan arınmış mimari.
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.
CMS'ten öte bir uygulama platformu: Oto Galeri, Turizm Acentası, CRM/ERP — hepsi aynı altyapı üzerinde çalışır.
Kullanıcı modüllerinden gelen hatalar sistemi asla çökertmez. 3 kademeli aktif savunma ve karantina hattı.
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.
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
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.
Dependencies SpaceComposer paketleri ve Symfony kütüphaneleri bu izole alanda tutulur. vendor-dir yeniden yapılandırılmıştır.
User & Developer SpaceModüller, temalar, çeviriler ve Config Sync alanı. Geliştiricinin kendi kodları ile framework sistem dosyaları asla birbirine karışmaz.
Web RootDış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ı.
Kullanıcı alanından gelebilecek kötü yazılmış veya bozuk kodların tüm sistemi kilitlemesini engelleyen Üç Kademeli Aktif Savunma ve Karantina Hattı.
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.
// Ç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]; } }
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.
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:clear → lint:yaml →
lint:container komutları koşturulur. Hata varsa aktivasyon iptal edilir ve modül
kalıcı olarak karantinaya alınır. Dosya asla bozuk haliyle kaydedilmez.
Hibrit veri modeli, yüksek performanslı indeksleme ve çok dilli yapı — tümü ilk günden çekirdeğin hücrelerine işlenmiştir.
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.
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.
Ç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.
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.
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.
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.
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 | |
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:
#[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; }
Güvenlik ve performans, projenin son aşamasında "üzerine eklenen" bir cila değildir; sistemin en temel yapı taşlarıdır.
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.
Ç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.
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.
Çekirdek güvenlik, performans ve mimari omurga tamamlandı. Sıradaki geliştirme sprintlerinde aşağıdaki sistemler inşa edilecek.
cp-content altındaki tüm modüller çöktüğünde bile ayakta kalabilen, bağımsız varlıkları olan ve sistem yöneticisinin bozuk modülleri kapatmasını sağlayan izole web konsolu.
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.
Pimcore tarzı bağımsız medya kütüphanesi. Flysystem (S3, MinIO) ve LiipImagineBundle entegrasyonu ile URL üzerinden anlık görsel türetme sunan modern dosya yönetimi.
CPalius, topluluğun gücüyle en sağlam uygulama framework'üne dönüşecek. Fikirlerinizi, eleştirilerinizi ve mimari önerilerinizi heyecanla bekliyoruz.