XOOPS Mimarlık
Bu Belge Hakkında
Bu sayfada XOOPS’nin hem mevcut (2.5.x) hem de gelecekteki (4.0.x) sürümleri için geçerli olan kavramsal mimarisini açıklanmaktadır. Bazı diyagramlar katmanlı tasarım vizyonunu göstermektedir.
Versiyona özel ayrıntılar için:
- XOOPS 2.5.x Bugün:
mainfile.php, globaller ($xoopsDB,$xoopsUser), ön yüklemeler ve işleyici modelini kullanır - XOOPS 4.0 Hedef: PSR-15 ara katman yazılımı, DI kapsayıcısı, yönlendirici - bkz. Yol Haritası
Bu belge, XOOPS sistem mimarisine kapsamlı bir genel bakış sunarak, esnek ve genişletilebilir bir içerik yönetim sistemi oluşturmak için çeşitli bileşenlerin birlikte nasıl çalıştığını açıklar.
Genel Bakış
Section titled “Genel Bakış”XOOPS, endişeleri farklı katmanlara ayıran modüler bir mimariyi takip eder. Sistem birkaç temel prensip üzerine kurulmuştur:
- Modülerlik: İşlevsellik bağımsız, kurulabilir modules halinde düzenlenmiştir
- Genişletilebilirlik: Sistem, Core kod değiştirilmeden genişletilebilir
- Soyutlama: database ve sunum katmanları iş mantığından soyutlanmıştır
- Güvenlik: Yerleşik güvenlik mekanizmaları yaygın güvenlik açıklarına karşı koruma sağlar
Sistem Katmanları
Section titled “Sistem Katmanları”graph TB subgraph Presentation["🎨 Presentation Layer"] Themes["Themes"] Templates["Smarty Templates"] Blocks["Blocks"] end
subgraph Application["⚙️ Application Layer"] Modules["Modules"] Preloads["Preloads"] Controllers["Controllers"] BlockHandlers["Block Handlers"] end
subgraph Domain["📦 Domain Layer"] XoopsObject["XoopsObject"] Handlers["Object Handlers"] Criteria["Criteria System"] end
subgraph Infrastructure["🔧 Infrastructure Layer"] Database["XoopsDatabase"] Cache["Cache System"] Session["Session Manager"] Security["Security Layer"] end
Presentation --> Application Application --> Domain Domain --> Infrastructure
style Presentation fill:#e8f5e9,stroke:#388e3c style Application fill:#e3f2fd,stroke:#1976d2 style Domain fill:#fff3e0,stroke:#f57c00 style Infrastructure fill:#fce4ec,stroke:#c2185b1. Sunum Katmanı
Section titled “1. Sunum Katmanı”Sunum katmanı, Smarty template motorunu kullanarak user arayüzü oluşturmayı yönetir.
Temel Bileşenler:
- themes: Görsel stil ve düzen
- Smarty templates: Dinamik içerik oluşturma
- Bloklar: Yeniden kullanılabilir içerik widget’ları
2. Uygulama Katmanı
Section titled “2. Uygulama Katmanı”Uygulama katmanı iş mantığını, denetleyicileri ve module işlevselliğini içerir.
Temel Bileşenler:
- modules: Bağımsız işlevsellik paketleri
- İşleyiciler: Veri işleme sınıfları
- Ön yüklemeler: Etkinlik dinleyicileri ve hooks
3. Etki Alanı Katmanı
Section titled “3. Etki Alanı Katmanı”Etki alanı katmanı temel iş nesnelerini ve kurallarını içerir.
Temel Bileşenler:
- XoopsObject: Tüm etki alanı nesneleri için temel sınıf
- İşleyiciler: Etki alanı nesneleri için CRUD işlemleri
4. Altyapı Katmanı
Section titled “4. Altyapı Katmanı”Altyapı katmanı, database erişimi ve önbelleğe alma gibi temel hizmetleri sağlar.
Yaşam Döngüsü İste
Section titled “Yaşam Döngüsü İste”İstek yaşam döngüsünü anlamak, etkili XOOPS geliştirme için çok önemlidir.
XOOPS 2.5.x Sayfa Denetleyici Akışı
Section titled “XOOPS 2.5.x Sayfa Denetleyici Akışı”Geçerli XOOPS 2.5.x, her PHP dosyasının kendi isteğini işlediği bir Sayfa Denetleyicisi modelini kullanır. Globaller ($xoopsDB, $xoopsUser, $xoopsTpl, vb.) önyükleme sırasında başlatılır ve yürütme boyunca kullanılabilir.
sequenceDiagram participant Browser participant Entry as modules/mymod/index.php participant Main as mainfile.php participant Kernel as XOOPS Kernel participant DB as $xoopsDB participant User as $xoopsUser participant Handler as MyObjectHandler participant Tpl as $xoopsTpl (Smarty) participant Theme
Browser->>Entry: GET /modules/mymod/index.php
rect rgb(240, 248, 255) Note over Entry,User: Bootstrap Phase (mainfile.php) Entry->>Main: include mainfile.php Main->>Kernel: Initialize Core Kernel->>DB: Create XoopsDatabase (singleton) Kernel->>User: Load Session → $xoopsUser Kernel->>Tpl: Initialize Smarty → $xoopsTpl Main-->>Entry: Globals Ready end
rect rgb(255, 250, 240) Note over Entry,Handler: Page Controller Execution Entry->>Handler: xoops_getModuleHandler('myobject') Handler->>DB: query via Criteria DB-->>Handler: Result Set Handler-->>Entry: XoopsObject[] end
rect rgb(240, 255, 240) Note over Entry,Theme: Rendering Phase Entry->>Tpl: $xoopsTpl->assign('items', $objects) Entry->>Theme: include header.php Entry->>Tpl: $xoopsTpl->display('mymod_index.tpl') Entry->>Theme: include footer.php Theme-->>Browser: Complete HTML Page end2.5.x’teki Temel Globaller
Section titled “2.5.x’teki Temel Globaller”| Küresel | Tür | Başlatıldı | Amaç |
|---|---|---|---|
$xoopsDB | XoopsDatabase | Önyükleme | database bağlantısı (tekli) |
$xoopsUser | XoopsUser|null | Oturum yükü | Şu an oturum açmış user |
$xoopsTpl | XoopsTpl | template başlangıcı | Smarty template motoru |
$xoopsModule | XoopsModule | module yükü | Geçerli module içeriği |
$xoopsConfig | array | Yapılandırma yükü | Sistem konfigürasyonu |
1. Önyükleme Aşaması
Section titled “1. Önyükleme Aşaması”// mainfile.php is the entry pointinclude_once XOOPS_ROOT_PATH . '/mainfile.php';
// Core initialization$xoops = Xoops::getInstance();$xoops->boot();Adımlar:
- Yapılandırmayı yükleyin (
mainfile.php) - Otomatik yükleyiciyi başlatın
- Hata işlemeyi ayarlayın
- database bağlantısı kurun
- user oturumunu yükleyin
- Smarty template motorunu başlatın
2. Yönlendirme Aşaması
Section titled “2. Yönlendirme Aşaması”// Request routing to appropriate module$module = $GLOBALS['xoopsModule'];$controller = $module->getController();$controller->dispatch($request);Adımlar:
- Ayrıştırma isteği URL
- Hedef modülü tanımlayın
- module konfigürasyonunu yükleyin
- İzinleri kontrol edin
- Uygun işleyiciye yönlendirin
3. Yürütme Aşaması
Section titled “3. Yürütme Aşaması”// Controller execution$data = $handler->getObjects($criteria);$xoopsTpl->assign('items', $data);Adımlar:
- Denetleyici mantığını yürütün
- Veri katmanıyla etkileşim kurun
- İş kurallarını işleyin
- Görünüm verilerini hazırlayın
4. Oluşturma Aşaması
Section titled “4. Oluşturma Aşaması”// Template renderinginclude XOOPS_ROOT_PATH . '/header.php';$xoopsTpl->display('db:module_template.tpl');include XOOPS_ROOT_PATH . '/footer.php';Adımlar:
- theme düzenini uygulayın
- module şablonunu oluşturun
- Süreç blokları
- Çıkış yanıtı
Temel Bileşenler
Section titled “Temel Bileşenler”XoopsObject
Section titled “XoopsObject”XOOPS’deki tüm veri nesneleri için temel sınıf.
<?phpclass MyModuleItem extends XoopsObject{ public function __construct() { $this->initVar('id', XOBJ_DTYPE_INT, null, false); $this->initVar('title', XOBJ_DTYPE_TXTBOX, '', true, 255); $this->initVar('content', XOBJ_DTYPE_TXTAREA, '', false); $this->initVar('created', XOBJ_DTYPE_INT, time(), false); }}Anahtar Yöntemler:
initVar()- Nesne özelliklerini tanımlayıngetVar()- Özellik değerlerini alsetVar()- Özellik değerlerini ayarlayınassignVars()- Diziden toplu atama
XoopsPersistableObjectHandler
Section titled “XoopsPersistableObjectHandler”XoopsObject bulut sunucuları için CRUD işlemlerini yönetir.
<?phpclass MyModuleItemHandler extends XoopsPersistableObjectHandler{ public function __construct(\XoopsDatabase $db) { parent::__construct($db, 'mymodule_items', 'MyModuleItem', 'id', 'title'); }
public function getActiveItems($limit = 10) { $criteria = new CriteriaCompo(); $criteria->add(new Criteria('status', 1)); $criteria->setSort('created'); $criteria->setOrder('DESC'); $criteria->setLimit($limit);
return $this->getObjects($criteria); }}Anahtar Yöntemler:
create()- Yeni nesne örneği oluşturget()- Nesneyi kimliğe göre alinsert()- Nesneyi veritabanına kaydetdelete()- Nesneyi veritabanından kaldırgetObjects()- Birden fazla nesneyi algetCount()- Eşleşen nesneleri sayın
module Yapısı
Section titled “module Yapısı”Her XOOPS modülü standart bir dizin yapısını izler:
modules/mymodule/├── class/ # PHP classes│ ├── MyModuleItem.php│ └── MyModuleItemHandler.php├── include/ # Include files│ ├── common.php│ └── functions.php├── templates/ # Smarty templates│ ├── mymodule_index.tpl│ └── mymodule_item.tpl├── admin/ # Admin area│ ├── index.php│ └── menu.php├── language/ # Translations│ └── english/│ ├── main.php│ └── modinfo.php├── sql/ # Database schema│ └── mysql.sql├── xoops_version.php # Module info├── index.php # Module entry└── header.php # Module headerBağımlılık Enjeksiyon Kabı
Section titled “Bağımlılık Enjeksiyon Kabı”Modern XOOPS geliştirme, daha iyi test edilebilirlik için bağımlılık enjeksiyonundan yararlanabilir.
Temel Konteyner Uygulaması
Section titled “Temel Konteyner Uygulaması”<?phpclass XoopsDependencyContainer{ private array $services = [];
public function register(string $name, callable $factory): void { $this->services[$name] = $factory; }
public function resolve(string $name): mixed { if (!isset($this->services[$name])) { throw new \InvalidArgumentException("Service not found: $name"); }
$factory = $this->services[$name];
if (is_callable($factory)) { return $factory($this); }
return $factory; }
public function has(string $name): bool { return isset($this->services[$name]); }}PSR-11 Uyumlu Konteyner
Section titled “PSR-11 Uyumlu Konteyner”<?phpnamespace Xmf\Di;
use Psr\Container\ContainerInterface;
class BasicContainer implements ContainerInterface{ protected array $definitions = [];
public function set(string $id, mixed $value): void { $this->definitions[$id] = $value; }
public function get(string $id): mixed { if (!$this->has($id)) { throw new \InvalidArgumentException("Service not found: $id"); }
$entry = $this->definitions[$id];
if (is_callable($entry)) { return $entry($this); }
return $entry; }
public function has(string $id): bool { return isset($this->definitions[$id]); }}Kullanım Örneği
Section titled “Kullanım Örneği”<?php// Service registration$container = new XoopsDependencyContainer();
$container->register('database', function () { return XoopsDatabaseFactory::getDatabaseConnection();});
$container->register('userHandler', function ($c) { return new XoopsUserHandler($c->resolve('database'));});
// Service resolution$userHandler = $container->resolve('userHandler');$user = $userHandler->get($userId);Uzatma Noktaları
Section titled “Uzatma Noktaları”XOOPS çeşitli genişletme mekanizmaları sağlar:
1. Ön yüklemeler
Section titled “1. Ön yüklemeler”Ön yüklemeler, modüllerin temel olaylara bağlanmasına olanak tanır.
<?phpclass MymoduleCorePreload extends XoopsPreloadItem{ public static function eventCoreHeaderEnd($args) { // Execute when header processing ends }
public static function eventCoreFooterStart($args) { // Execute when footer processing starts }}2. Eklentiler
Section titled “2. Eklentiler”Eklentiler, modüllerdeki belirli işlevleri genişletir.
<?phpclass MymoduleNotifyPlugin{ public function onItemCreate($item) { // Send notification when item is created }}3. Filtreler
Section titled “3. Filtreler”Filtreler, sistemden geçerken verileri değiştirir.
<?php// Content filter example$myts = MyTextSanitizer::getInstance();$content = $myts->displayTarea($rawContent, 1, 1, 1);En İyi Uygulamalar
Section titled “En İyi Uygulamalar”Kod Organizasyonu
Section titled “Kod Organizasyonu”- Yeni kod için ad alanlarını kullanın:
namespace XoopsModules\MyModule;
class Item extends \XoopsObject { // Implementation }- PSR-4 otomatik yüklemeyi takip edin:
{ "autoload": { "psr-4": { "XoopsModules\\MyModule\\": "class/" } } }- Ayrı endişeler:
class/’deki alan adı mantığıtemplates/’de sunum- module kökündeki kontrolörler
Performans
Section titled “Performans”- Pahalı işlemler için önbelleğe almayı kullanın
- Mümkün olduğunda kaynakları geç yükleme
- **Kriter gruplandırmayı kullanarak database sorgularını en aza indirin
- **Karmaşık mantıktan kaçınarak şablonları optimize edin
Güvenlik
Section titled “Güvenlik”- Tüm girişleri doğrulayın
Xmf\Request’yi kullanarak - Şablonlarda çıkış çıkışı
- database sorguları için hazırlanmış ifadeleri kullanın
- Hassas işlemlerden önce izinleri kontrol edin
İlgili Belgeler
Section titled “İlgili Belgeler”- Tasarım-Desenleri - XOOPS’de kullanılan tasarım desenleri
- database Katmanı - database soyutlama ayrıntıları
- Smarty Temel Bilgiler - template sistem dokümantasyonu
- En İyi Güvenlik Uygulamaları - Güvenlik yönergeleri
#xoops #mimari #temel #tasarım #sistem tasarımı