معماری XOOPS
این سند یک نمای کلی از معماری سیستم XOOPS ارائه می دهد و توضیح می دهد که چگونه اجزای مختلف با هم کار می کنند تا یک سیستم مدیریت محتوای منعطف و توسعه پذیر ایجاد کنند.
بررسی اجمالی
Section titled “بررسی اجمالی”XOOPS از یک معماری مدولار پیروی می کند که نگرانی ها را به لایه های مجزا جدا می کند. این سیستم بر اساس چندین اصل اصلی ساخته شده است:
- ** ماژولاریت **: عملکرد در ماژول های مستقل و قابل نصب سازماندهی شده است
- توسعه پذیری: سیستم را می توان بدون تغییر کد اصلی گسترش داد
- انتزاع: پایگاه داده و لایه های ارائه از منطق تجاری انتزاع شده اند
- امنیت: مکانیسم های امنیتی داخلی از آسیب پذیری های رایج محافظت می کند
لایه های سیستم
Section titled “لایه های سیستم”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. لایه ارائه
Section titled “1. لایه ارائه”لایه ارائه رندر رابط کاربری را با استفاده از موتور قالب Smarty انجام می دهد.
** اجزای کلیدی:**
- **موضوعات **: یک ظاهر طراحی و چیدمان بصری
- قالب های هوشمند: رندر محتوای پویا
- بلاک: ویجت های محتوای قابل استفاده مجدد
2. لایه برنامه
Section titled “2. لایه برنامه”لایه برنامه شامل منطق تجاری، کنترلرها و عملکرد ماژول است.
** اجزای کلیدی:**
- ** ماژول ها **: بسته های عملکردی مستقل
- Handlers: کلاس های دستکاری داده ها
- پیش بارگیری: شنوندگان رویداد و قلاب
3. لایه دامنه
Section titled “3. لایه دامنه”لایه دامنه حاوی اشیاء و قوانین تجاری اصلی است.
** اجزای کلیدی:**
- XoopsObject: کلاس پایه برای همه اشیاء دامنه
- Handlers: عملیات CRUD برای اشیاء دامنه
4. لایه زیرساخت
Section titled “4. لایه زیرساخت”لایه زیرساخت خدمات اصلی مانند دسترسی به پایگاه داده و ذخیره سازی را ارائه می دهد.
چرخه عمر را درخواست کنید
Section titled “چرخه عمر را درخواست کنید”درک چرخه عمر درخواست برای توسعه موثر XOOPS بسیار مهم است.
XOOPS 2.5.x جریان کنترل کننده صفحه
Section titled “XOOPS 2.5.x جریان کنترل کننده صفحه”XOOPS 2.5.x فعلی از یک الگوی Page Controller استفاده می کند که در آن هر فایل PHP درخواست خود را انجام می دهد. گلوبال ها ($xoopsDB، $xoopsUser، $xoopsTpl، و غیره) در طول بوت استرپ مقداردهی اولیه می شوند و در طول اجرا در دسترس هستند.
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 endکلیدهای جهانی در 2.5.x
Section titled “کلیدهای جهانی در 2.5.x”| جهانی | نوع | اولیه | هدف |
|---|---|---|---|
$xoopsDB | XoopsDatabase | بوت استرپ | اتصال به پایگاه داده (تک صدا) |
$xoopsUser | XoopsUser|null | بار جلسه | کاربر فعلی وارد شده |
$xoopsTpl | XoopsTpl | قالب init | موتور قالب هوشمند |
$xoopsModule | XoopsModule | بار ماژول | زمینه ماژول فعلی |
$xoopsConfig | array | بار پیکربندی | پیکربندی سیستم |
1. فاز بوت استرپ
Section titled “1. فاز بوت استرپ”// mainfile.php is the entry pointinclude_once XOOPS_ROOT_PATH . '/mainfile.php';
// Core initialization$xoops = XOOPS::getInstance();$xoops->boot();مراحل:
- پیکربندی بارگذاری (
mainfile.php) - autoloader را راه اندازی کنید
- مدیریت خطا را تنظیم کنید
- اتصال پایگاه داده را ایجاد کنید
- بارگذاری جلسه کاربر
- راه اندازی موتور قالب Smarty
2. فاز مسیریابی
Section titled “2. فاز مسیریابی”// Request routing to appropriate module$module = $GLOBALS['xoopsModule'];$controller = $module->getController();$controller->dispatch($request);مراحل:
- URL درخواست را تجزیه کنید
- ماژول هدف را شناسایی کنید
- بارگذاری پیکربندی ماژول
- مجوزها را بررسی کنید
- مسیر به کنترل کننده مناسب
3. مرحله اجرا
Section titled “3. مرحله اجرا”// Controller execution$data = $handler->getObjects($criteria);$xoopsTpl->assign('items', $data);```**مراحل:**1. منطق کنترلر را اجرا کنید2. تعامل با لایه داده3. قوانین کسب و کار را پردازش کنید4. داده های مشاهده را آماده کنید
### 4. فاز رندر
```php// Template renderinginclude XOOPS_ROOT_PATH . '/header.php';$xoopsTpl->display('db:module_template.tpl');include XOOPS_ROOT_PATH . '/footer.php';مراحل:
- طرح تم را اعمال کنید
- رندر قالب ماژول
- بلوک های فرآیند
- پاسخ خروجی
اجزای اصلی
Section titled “اجزای اصلی”XoopsObject
Section titled “XoopsObject”کلاس پایه برای تمام اشیاء داده در XOOPS.
<?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); }}روش های کلیدی:
initVar()- خصوصیات شی را تعریف کنیدgetVar()- مقادیر دارایی را بازیابی کنیدsetVar()- مقادیر ویژگی را تنظیم کنیدassignVars()- تخصیص انبوه از آرایه
XoopsPersistableObjectHandler
Section titled “XoopsPersistableObjectHandler”عملیات CRUD را برای نمونه های XoopsObject مدیریت می کند.
<?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); }}روش های کلیدی:
create()- نمونه شی جدید ایجاد کنیدget()- شیء را با شناسه بازیابی کنیدinsert()- ذخیره شی در پایگاه دادهdelete()- حذف شی از پایگاه دادهgetObjects()- چندین اشیاء را بازیابی کنیدgetCount()- شمارش اشیاء تطبیق
ساختار ماژول
Section titled “ساختار ماژول”هر ماژول XOOPS از یک ساختار دایرکتوری استاندارد پیروی می کند:
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 headerظرف تزریق وابستگی
Section titled “ظرف تزریق وابستگی”توسعه مدرن XOOPS می تواند از تزریق وابستگی برای آزمایش پذیری بهتر استفاده کند.
اجرای پایه کانتینر
Section titled “اجرای پایه کانتینر”<?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
Section titled “کانتینر سازگار با PSR-11”<?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]); }}مثال استفاده
Section titled “مثال استفاده”<?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);نقاط توسعه
Section titled “نقاط توسعه”XOOPS چندین مکانیسم توسعه را ارائه می دهد:
1. پیش بارگیری ها
Section titled “1. پیش بارگیری ها”پیش بارگذاری به ماژول ها اجازه می دهد تا به رویدادهای اصلی متصل شوند.
<?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. پلاگین ها
Section titled “2. پلاگین ها”پلاگین ها عملکرد خاصی را در ماژول ها گسترش می دهند.
<?phpclass MymoduleNotifyPlugin{ public function onItemCreate($item) { // Send notification when item is created }}3. فیلترها
Section titled “3. فیلترها”فیلترها داده ها را هنگام عبور از سیستم تغییر می دهند.
<?php// Content filter example$myts = MyTextSanitizer::getInstance();$content = $myts->displayTarea($rawContent, 1, 1, 1);بهترین شیوه ها
Section titled “بهترین شیوه ها”سازمان کد
Section titled “سازمان کد”- از namespace برای کد جدید استفاده کنید:
namespace XoopsModules\MyModule;
class Item extends \XoopsObject { // Implementation }- بارگذاری خودکار PSR-4 را دنبال کنید:
{ "autoload": { "psr-4": { "XoopsModules\\MyModule\\": "class/" } } }- **نگرانی های جداگانه **:
- منطق دامنه در
class/ - ارائه در
templates/ - کنترلرها در ریشه ماژول
- منطق دامنه در
عملکرد
Section titled “عملکرد”- از کش برای عملیات گران قیمت استفاده کنید
- **تنبل بار ** منابع در صورت امکان
- به حداقل رساندن پرس و جوهای پایگاه داده با استفاده از دسته بندی معیارها
- بهینه سازی قالب با اجتناب از منطق پیچیده
- تأیید تمام ورودی با استفاده از
XMF\Request - خروجی خروجی در قالب ها
- از دستورات آماده برای پرس و جوهای پایگاه داده استفاده کنید
- قبل از عملیات حساس، مجوزها را بررسی کنید
مستندات مرتبط
Section titled “مستندات مرتبط”- Design-Patterns - الگوهای طراحی مورد استفاده در XOOPS
- لایه پایگاه داده - جزئیات انتزاع پایگاه داده
- Smarty Basics - اسناد سیستم الگو
- بهترین شیوه های امنیتی - دستورالعمل های امنیتی
#xoops #معماری #هسته #طراحی #سیستم-طراحی