Kiến trúc XOOPS
Tài liệu này cung cấp cái nhìn tổng quan toàn diện về kiến trúc hệ thống XOOPS, giải thích cách các thành phần khác nhau phối hợp với nhau để tạo ra một hệ thống quản lý nội dung linh hoạt và có thể mở rộng.
Tổng quan
Phần tiêu đề “Tổng quan”XOOPS tuân theo kiến trúc mô-đun phân chia các mối quan tâm thành các lớp riêng biệt. Hệ thống được xây dựng xung quanh một số nguyên tắc cốt lõi:
- Tính mô-đun: Chức năng được tổ chức thành modules độc lập, có thể cài đặt
- Khả năng mở rộng: Hệ thống có thể được mở rộng mà không cần sửa đổi mã lõi
- Tóm tắt: Cơ sở dữ liệu và các lớp trình bày được trừu tượng hóa khỏi logic nghiệp vụ
- Bảo mật: Cơ chế bảo mật tích hợp bảo vệ khỏi các lỗ hổng phổ biến
Lớp hệ thống
Phần tiêu đề “Lớp hệ thống”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. Lớp trình bày
Phần tiêu đề “1. Lớp trình bày”Lớp trình bày xử lý việc hiển thị giao diện người dùng bằng cách sử dụng công cụ mẫu Smarty.
Thành phần chính:
- Chủ đề: Kiểu dáng và bố cục trực quan
- Mẫu Smarty: Hiển thị nội dung động
- Khối: Các tiện ích nội dung có thể tái sử dụng
2. Lớp ứng dụng
Phần tiêu đề “2. Lớp ứng dụng”Lớp ứng dụng chứa logic nghiệp vụ, bộ điều khiển và chức năng mô-đun.
Thành phần chính:
- Mô-đun: Gói chức năng độc lập
- Trình xử lý: Thao tác dữ liệu classes
- Tải trước: Trình nghe và hook sự kiện
3. Lớp miền
Phần tiêu đề “3. Lớp miền”Lớp miền chứa các đối tượng và quy tắc kinh doanh cốt lõi.
Thành phần chính:
- XoopsObject: class cơ sở cho tất cả các đối tượng miền
- Trình xử lý: Hoạt động CRUD cho đối tượng miền
4. Lớp cơ sở hạ tầng
Phần tiêu đề “4. Lớp cơ sở hạ tầng”Lớp cơ sở hạ tầng cung cấp các dịch vụ cốt lõi như truy cập cơ sở dữ liệu và bộ nhớ đệm.
Vòng đời yêu cầu
Phần tiêu đề “Vòng đời yêu cầu”Hiểu vòng đời yêu cầu là rất quan trọng để phát triển XOOPS hiệu quả.
Luồng điều khiển trang XOOPS 2.5.x
Phần tiêu đề “Luồng điều khiển trang XOOPS 2.5.x”XOOPS 2.5.x hiện tại sử dụng mẫu Trình điều khiển trang trong đó mỗi tệp PHP xử lý yêu cầu riêng của nó. Globals ($xoopsDB, $xoopsUser, $xoopsTpl, v.v.) được khởi tạo trong quá trình khởi động và có sẵn trong suốt quá trình thực thi.
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 endCác quả cầu chính trong 2.5.x
Phần tiêu đề “Các quả cầu chính trong 2.5.x”| Toàn cầu | Loại | Đã khởi tạo | Mục đích |
|---|---|---|---|
$xoopsDB | XoopsDatabase | Khởi động | Kết nối cơ sở dữ liệu (singleton) |
$xoopsUser | XoopsUser|null | Tải phiên | Người dùng đã đăng nhập hiện tại |
$xoopsTpl | XoopsTpl | Mẫu khởi tạo | Công cụ tạo mẫu Smarty |
$xoopsModule | XoopsModule | Tải mô-đun | Bối cảnh mô-đun hiện tại |
$xoopsConfig | array | Tải cấu hình | Cấu hình hệ thống |
| Trong XOOPS 4.0, mẫu Bộ điều khiển trang được thay thế bằng PSR-15 Middleware Pipeline và điều phối dựa trên bộ định tuyến. Toàn cầu được thay thế bằng nội xạ phụ thuộc. Xem Hợp đồng chế độ kết hợp để biết đảm bảo tính tương thích trong quá trình di chuyển. | |||
| ::: |
1. Giai đoạn khởi động
Phần tiêu đề “1. Giai đoạn khởi động”// mainfile.php is the entry pointinclude_once XOOPS_ROOT_PATH . '/mainfile.php';
// Core initialization$xoops = Xoops::getInstance();$xoops->boot();Các bước:
- Cấu hình tải (
mainfile.php) - Khởi tạo trình tải tự động
- Thiết lập xử lý lỗi
- Thiết lập kết nối cơ sở dữ liệu
- Tải phiên người dùng
- Khởi tạo công cụ mẫu Smarty
2. Giai đoạn định tuyến
Phần tiêu đề “2. Giai đoạn định tuyến”// Request routing to appropriate module$module = $GLOBALS['xoopsModule'];$controller = $module->getController();$controller->dispatch($request);Các bước:
- Yêu cầu phân tích cú pháp URL
- Xác định module mục tiêu
- Tải cấu hình mô-đun
- Kiểm tra quyền
- Hướng đến người xử lý thích hợp
3. Giai đoạn thực hiện
Phần tiêu đề “3. Giai đoạn thực hiện”// Controller execution$data = $handler->getObjects($criteria);$xoopsTpl->assign('items', $data);Các bước:
- Thực thi logic điều khiển
- Tương tác với lớp dữ liệu
- Xử lý quy tắc kinh doanh
- Chuẩn bị dữ liệu xem
4. Giai đoạn kết xuất
Phần tiêu đề “4. Giai đoạn kết xuất”// Template renderinginclude XOOPS_ROOT_PATH . '/header.php';$xoopsTpl->display('db:module_template.tpl');include XOOPS_ROOT_PATH . '/footer.php';Các bước:
- Áp dụng bố cục chủ đề
- Kết xuất mẫu mô-đun
- Khối xử lý
- Phản hồi đầu ra
Thành phần cốt lõi
Phần tiêu đề “Thành phần cốt lõi”XoopsObject
Phần tiêu đề “XoopsObject”class cơ sở cho tất cả các đối tượng dữ liệu trong 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); }}Các phương pháp chính:
initVar()- Xác định thuộc tính đối tượnggetVar()- Truy xuất giá trị thuộc tínhsetVar()- Đặt giá trị thuộc tínhassignVars()- Gán hàng loạt từ mảng
XoopsPersistableObjectHandler
Phần tiêu đề “XoopsPersistableObjectHandler”Xử lý các hoạt động CRUD cho các phiên bản 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); }}Các phương pháp chính:
create()- Tạo đối tượng mớiget()- Truy xuất đối tượng theo IDinsert()- Lưu đối tượng vào cơ sở dữ liệudelete()- Xóa đối tượng khỏi cơ sở dữ liệugetObjects()- Truy xuất nhiều đối tượnggetCount()- Đếm các đối tượng phù hợp
Cấu trúc mô-đun
Phần tiêu đề “Cấu trúc mô-đun”Mỗi mô-đun XOOPS đều tuân theo cấu trúc thư mục chuẩn:
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 headerVùng chứa phụ thuộc
Phần tiêu đề “Vùng chứa phụ thuộc”Sự phát triển XOOPS hiện đại có thể tận dụng tính năng chèn phụ thuộc để có khả năng kiểm tra tốt hơn.
Triển khai vùng chứa cơ bản
Phần tiêu đề “Triển khai vùng chứa cơ bản”<?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]); }}Thùng chứa tương thích PSR-11
Phần tiêu đề “Thùng chứa tương thích 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]); }}Ví dụ sử dụng
Phần tiêu đề “Ví dụ sử dụng”<?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);Điểm mở rộng
Phần tiêu đề “Điểm mở rộng”XOOPS cung cấp một số cơ chế mở rộng:
1. Tải trước
Phần tiêu đề “1. Tải trước”Tải trước cho phép modules tham gia vào các sự kiện cốt lõi.
<?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. Plugin
Phần tiêu đề “2. Plugin”Các plugin mở rộng chức năng cụ thể trong modules.
<?phpclass MymoduleNotifyPlugin{ public function onItemCreate($item) { // Send notification when item is created }}3. Bộ lọc
Phần tiêu đề “3. Bộ lọc”Bộ lọc sửa đổi dữ liệu khi nó đi qua hệ thống.
<?php// Content filter example$myts = MyTextSanitizer::getInstance();$content = $myts->displayTarea($rawContent, 1, 1, 1);Các phương pháp hay nhất
Phần tiêu đề “Các phương pháp hay nhất”Tổ chức mã
Phần tiêu đề “Tổ chức mã”- Sử dụng không gian tên cho mã mới:
namespace XoopsModules\MyModule;
class Item extends \XoopsObject { // Implementation }- Theo dõi quá trình tự động tải PSR-4:
{ "autoload": { "psr-4": { "XoopsModules\\MyModule\\": "class/" } } }- Các mối quan tâm riêng:
- Logic miền trong
class/ - Trình bày trong
templates/ - Bộ điều khiển trong mô-đun gốc
- Logic miền trong
Hiệu suất
Phần tiêu đề “Hiệu suất”- Sử dụng bộ nhớ đệm cho các hoạt động tốn kém
- Tải lười biếng tài nguyên khi có thể
- Giảm thiểu các truy vấn cơ sở dữ liệu bằng cách sử dụng nhóm tiêu chí
- Tối ưu hóa templates bằng cách tránh logic phức tạp
Bảo mật1. Xác thực tất cả đầu vào bằng Xmf\Request
Phần tiêu đề “Bảo mật1. Xác thực tất cả đầu vào bằng Xmf\Request”- Đầu ra thoát trong templates
- Sử dụng các câu lệnh đã chuẩn bị sẵn cho các truy vấn cơ sở dữ liệu
- Kiểm tra quyền trước các thao tác nhạy cảm
Tài liệu liên quan
Phần tiêu đề “Tài liệu liên quan”- Các mẫu thiết kế - Các mẫu thiết kế được sử dụng trong XOOPS
- Lớp cơ sở dữ liệu - Chi tiết trừu tượng hóa cơ sở dữ liệu
- Smarty Thông tin cơ bản - Tài liệu hệ thống mẫu
- Các phương pháp bảo mật tốt nhất - Nguyên tắc bảo mật
#xoops #architecture #core #design #system-design