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.
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.
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.
Manifesto Law 5.3 gereği, RichTextSanitizer ile veritabanına kaydedilecek her zengin metin çekirdek seviyesinde sterilize edilir.
Hibrit JSON tabanlı verilerden SchemaOrgBuilder aracılığıyla otomatik olarak JSON-LD (Schema.org) üretimi (BlogPosting, WebPage).
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.
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; }
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.
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.
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.
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ü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.
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.
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ı.
#[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.
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ü.
/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).
/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.
/aacp/quarantine — module_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.
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.
REST Gateway için anahtar üretimi ve yaşam döngüsü yönetimi.
DB + attribute + flat-file kaynaklı görevlerin birleşik listesi.
Tüm kanca noktalarını ve bağlı dinleyicileri keşfeden panel.
Aktif/pasif/varsayılan dil ayarları, tek doğruluk kaynağı.
Blog, Medya ve Menü modülleri, platformun her genişletme noktasını (API, Hook, Cron, Plugin, Settings) uçtan uca kullanan referans implementasyonlardır.
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.
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.
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, 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.
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.
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.
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.
CPalius CMF'in kurumsal omurgasını oluşturan 5 temel mimari prensip ve kod seviyesindeki derin özellikleri.
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.
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);
}
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);
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));
}
}
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);
}
İ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.
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.
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.
#[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ı.
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.
CPalius, topluluğun gücüyle en sağlam uygulama framework'üne dönüşecek. Fikirlerinizi, eleştirilerinizi ve mimari önerilerinizi heyecanla bekliyoruz.