ADR-002 - چکیده پایگاه داده
ADR-002: انتزاع پایگاه داده
Section titled “ADR-002: انتزاع پایگاه داده”ثبت تصمیم معماری برای الگوی دسترسی به پایگاه داده شی گرا XOOPS.
پذیرفته شده - الگوی اصلی از XOOPS 2.0
XOOPS به یک استراتژی تعامل با پایگاه داده نیاز داشت که:
- سینتکس SQL مخصوص پایگاه داده را انتزاع کنید
- عملیات CRUD منسجم را در همه ماژول ها ارائه دهید
- پاکسازی و فرار خودکار داده ها را فعال کنید
- پشتیبانی از تغییرات موتور پایگاه داده آینده
- عملیات مشترک را برای توسعه دهندگان ساده کنید
جایگزین ها عبارت بودند از:
- SQL خام در سراسر پایگاه کد
- ORM کامل (دکترین، فصیح)
- انتزاع سبک وزن سفارشی
نمودار تصمیم گیری
Section titled “نمودار تصمیم گیری”graph TB subgraph "Application Layer" A[Module Code] B[Handler Methods] end
subgraph "Abstraction Layer" C[XoopsObjectHandler] D[XoopsPersistableObjectHandler] E[Criteria System] end
subgraph "Database Layer" F[XoopsDatabase] G[MySQLDatabase] H[PDO Wrapper] end
subgraph "Storage" I[(MySQL/MariaDB)] end
A --> B B --> C B --> D C --> E D --> E E --> F F --> G F --> H G --> I H --> Iما یک Handler Pattern را با موارد زیر پیاده سازی خواهیم کرد:
1. XoopsObject - ظرف داده
Section titled “1. XoopsObject - ظرف داده”هر موجودیت داده XoopsObject را گسترش می دهد:
class Item 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('status', XOBJ_DTYPE_INT, 0, false); }}2. Handler - Operations Manager
Section titled “2. Handler - Operations Manager”هر شی دارای یک کنترل کننده مربوطه است:
class ItemHandler extends XoopsPersistableObjectHandler{ public function __construct($db) { parent::__construct($db, 'mymodule_items', Item::class, 'id', 'title'); }
// CRUD methods inherited: // - create(), get(), insert(), delete() // - getObjects(), getCount(), getAll()}3. معیارها - Query Builder
Section titled “3. معیارها - Query Builder”شرایط پرس و جو شی گرا:
$criteria = new CriteriaCompo();$criteria->add(new Criteria('status', 1));$criteria->add(new Criteria('created', time() - 86400, '>='));$criteria->setSort('created');$criteria->setOrder('DESC');$criteria->setLimit(10);
$items = $handler->getObjects($criteria);ثابت نوع داده
Section titled “ثابت نوع داده”// Variable types with automatic sanitizationXOBJ_DTYPE_INT // IntegerXOBJ_DTYPE_TXTBOX // Single-line text (escaped)XOBJ_DTYPE_TXTAREA // Multi-line text (escaped)XOBJ_DTYPE_EMAIL // Email validationXOBJ_DTYPE_URL // URL validationXOBJ_DTYPE_ARRAY // Serialized arrayXOBJ_DTYPE_OTHER // No processingXOBJ_DTYPE_FLOAT // Floating pointوراثت Handler
Section titled “وراثت Handler”classDiagram class XoopsObjectHandler { <<abstract>> #db: XoopsDatabase +create(): XoopsObject +get(id): XoopsObject +insert(object): bool +delete(object): bool }
class XoopsPersistableObjectHandler { +getObjects(criteria): array +getCount(criteria): int +getAll(criteria): array +deleteAll(criteria): bool +updateAll(field, value, criteria): bool }
class ItemHandler { +getPublishedItems(): array +getByCategory(catId): array }
XoopsObjectHandler <|-- XoopsPersistableObjectHandler XoopsPersistableObjectHandler <|-- ItemHandler- **ثبات **: همه ماژول ها از الگوهای یکسانی استفاده می کنند
- امنیت: فرار خودکار از تزریق SQL جلوگیری می کند
- سادگی: عملیات رایج به حداقل کد نیاز دارد
- قابلیت نگهداری: تغییرات در لایه پایگاه داده بر ماژول ها تأثیر نمی گذارد
- آزمایش پذیری: کنترل کننده ها را می توان برای آزمایش مورد تمسخر قرار داد
- ** عملکرد **: سربار انتزاع اضافی
- پیچیدگی: منحنی یادگیری برای توسعه دهندگان جدید
- محدودیت ها: پرس و جوهای پیچیده ممکن است به SQL خام نیاز داشته باشند
- ** مشکل N+1 **: بدون بارگیری مشتاق داخلی
- ** عملکرد **: اشیایی که اغلب به آنها دسترسی دارند را در حافظه پنهان ذخیره کنید
- پرس و جوهای پیچیده: در صورت نیاز به SQL خام اجازه دهید
- N+1: از getAll() با معیارهای مناسب استفاده کنید
تکامل به XOOPS 4.0
Section titled “تکامل به XOOPS 4.0”flowchart LR subgraph "Current (2.5.x)" A[XoopsDatabase] B[Handlers] C[Criteria] end
subgraph "Future (4.0.x)" D[PDO/DBAL] E[Repository Pattern] F[Query Builder] G[DI Container] end
A --> D B --> E C --> F D --> G E --> Gبرنامه های XOOPS 4.0:
- دکترین DBAL برای انتزاع پایگاه داده
- الگوی مخزن جایگزین کنترلرها
- سازنده پرس و جو برای پرس و جوهای پیچیده
- یکپارچه سازی کامل کانتینر PSR-11
نمونه کد
Section titled “نمونه کد”CRUD پایه
Section titled “CRUD پایه”$helper = Helper::getInstance();$handler = $helper->getHandler('Item');
// Create$item = $handler->create();$item->setVar('title', 'New Item');$handler->insert($item);
// Read$item = $handler->get($id);$title = $item->getVar('title');
// Update$item->setVar('title', 'Updated Title');$handler->insert($item);
// Delete$handler->delete($item);پرس و جو پیچیده
Section titled “پرس و جو پیچیده”$criteria = new CriteriaCompo();$criteria->add(new Criteria('status', 'published'));$criteria->add(new Criteria('category_id', '(1,2,3)', 'IN'));$criteria->add(new Criteria('created', strtotime('-30 days'), '>='));$criteria->setSort('views');$criteria->setOrder('DESC');$criteria->setLimit(10);$criteria->setStart(0);
$items = $handler->getObjects($criteria);$total = $handler->getCount($criteria);تصمیمات مرتبط
Section titled “تصمیمات مرتبط”- ADR-001: معماری مدولار
- ADR-003: Smarty Template Engine
- مارتین فاولر - الگوهای معماری کاربردی سازمانی
- مفاهیم طراحی دامنه محور
- الگوهای Active Record در مقابل Data Mapper
#xoops #معماری #adr #پایگاه داده #هندلر #طراحی-تصمیم