Adathozzáférési minta kiválasztása
2.5.x ✅ 4.0.x ✅
Melyik mintát használjam? Ez a döntési fa segít a közvetlen kezelők, a tárolóminta, a szolgáltatási réteg és a CQRS közötti választásban.
Gyors döntési fa
Szekció neve “Gyors döntési fa”flowchart TD START([Start Here]) --> Q1{How complex is<br/>your module?}
Q1 -->|Simple CRUD<br/>1-3 entities| Q2{Need testing<br/>or mocking?} Q1 -->|Moderate<br/>4-10 entities| Q3{Multiple data<br/>sources?} Q1 -->|Complex<br/>10+ entities| Q4{High traffic or<br/>read/write asymmetry?}
Q2 -->|No| HANDLER[✅ Direct Handler] Q2 -->|Yes| REPO[✅ Repository Pattern]
Q3 -->|No, just DB| REPO Q3 -->|Yes, APIs/cache| SERVICE[✅ Service Layer]
Q4 -->|No| SERVICE Q4 -->|Yes, need<br/>separate scaling| CQRS[✅ CQRS Pattern]
HANDLER --> DONE([Choose Pattern]) REPO --> DONE SERVICE --> DONE CQRS --> DONE
style HANDLER fill:#c8e6c9,stroke:#2e7d32 style REPO fill:#bbdefb,stroke:#1565c0 style SERVICE fill:#fff9c4,stroke:#f9a825 style CQRS fill:#ffcdd2,stroke:#c62828Minta-összehasonlítás
Szekció neve “Minta-összehasonlítás”| Kritériumok | Közvetlen kezelő | Adattár | Szolgáltatási réteg | CQRS |
|---|---|---|---|---|
| Bonyolultság | ⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Tesztelhetőség | ❌ Kemény | ✅ Jó | ✅ Remek | ✅ Remek |
| Rugalmasság | ❌ Alacsony | ✅ Közepes | ✅ Magas | ✅ Nagyon magas |
| XOOPS 2.5.x | ✅ Natív | ✅ Működik | ✅ Működik | ⚠️ Komplex |
| XOOPS 4.0 | ⚠️ Elavult | ✅ Ajánlott | ✅ Ajánlott | ✅ Mérleghez |
| Csapatlétszám | 1 dev | 1-3 fejlesztő | 2-5 fejlesztő | 5+ fejlesztő |
| Karbantartás | ❌ Magasabb | ✅ Közepes | ✅ Alsó | ⚠️ Szakértelmet igényel |
Mikor kell használni az egyes mintákat
Szekció neve “Mikor kell használni az egyes mintákat”✅ Közvetlen kezelő (XOOPSPersistableObjectHandler)
Szekció neve “✅ Közvetlen kezelő (XOOPSPersistableObjectHandler)”A legjobb: Egyszerű modulok, gyors prototípusok, tanulás XOOPS
// Simple and direct - good for small modules$handler = xoops_getModuleHandler('article', 'news');$articles = $handler->getObjects(new Criteria('status', 1));Válassza ezt, amikor:
- Egyszerű modul építése 1-3 adatbázistáblával
- Gyors prototípus készítése
- Te vagy az egyetlen fejlesztő, és nincs szüksége tesztekre
- A modul nem fog jelentősen növekedni
Korlátozások:
- Nehezen tesztelhető egységteszt (globális függőség)
- Szoros csatolás a XOOPS adatbázisréteghez
- Az üzleti logika hajlamos beszivárogni a vezérlőkbe
✅ Repository Pattern
Szekció neve “✅ Repository Pattern”A legjobb: A legtöbb modul, tesztelhetőségre vágyó csapatok
// Abstraction allows mocking for testsinterface ArticleRepositoryInterface { public function findPublished(): array; public function save(Article $article): void;}
class XoopsArticleRepository implements ArticleRepositoryInterface { private $handler;
public function __construct() { $this->handler = xoops_getModuleHandler('article', 'news'); }
public function findPublished(): array { return $this->handler->getObjects(new Criteria('status', 1)); }}Válassza ezt, amikor:
- Egységteszteket szeretne írni
- Később módosíthatja az adatforrásokat (DB → API)
- 2+ fejlesztővel dolgozom
- modulok építése forgalmazáshoz
Frissítési útvonal: Ez az ajánlott minta a XOOPS 4.0 előkészítéshez.
✅ Szolgáltatási réteg
Szekció neve “✅ Szolgáltatási réteg”A legjobb: Összetett üzleti logikával rendelkező modulok
// Service coordinates multiple repositories and contains business rulesclass ArticlePublicationService { public function __construct( private ArticleRepositoryInterface $articles, private NotificationServiceInterface $notifications, private CacheInterface $cache ) {}
public function publish(int $articleId): void { $article = $this->articles->find($articleId); $article->setStatus('published'); $article->setPublishedAt(new DateTime());
$this->articles->save($article); $this->notifications->notifySubscribers($article); $this->cache->invalidate("article:{$articleId}"); }}Válassza ezt, amikor:
- A műveletek több adatforrást ölelnek fel
- Az üzleti szabályok összetettek
- Tranzakciókezelésre van szüksége
- Az alkalmazás több része ugyanezt teszi
Frissítési útvonal: Kombinálja a Repository-val a robusztus architektúra érdekében.
⚠️ CQRS (Parancslekérdezési felelősség elkülönítése)
Szekció neve “⚠️ CQRS (Parancslekérdezési felelősség elkülönítése)”A legjobb: Nagyméretű modulok read/write aszimmetriával
// Commands modify stateclass PublishArticleCommand { public function __construct( public readonly int $articleId, public readonly int $publisherId ) {}}
// Queries read state (can use denormalized read models)class GetPublishedArticlesQuery { public function __construct( public readonly int $limit = 10 ) {}}Válassza ezt, amikor:
- Jelentősen meghaladja az írások számát (100:1 vagy több)
- Különböző skálázásra van szüksége az olvasáshoz és az íráshoz
- Összetett reporting/analytics követelmények
- Az események beszerzése előnyös lenne az Ön domainjének
Figyelem: A CQRS jelentősen bonyolulttá teszi. A legtöbb XOOPS modulnak nincs rá szüksége.
Ajánlott frissítési útvonal
Szekció neve “Ajánlott frissítési útvonal”flowchart LR H0["Direct Handler<br/>(XOOPS 2.5.x today)"] R["Repository Pattern<br/>(Recommended next step)"] S["+ Service Layer<br/>(When complexity grows)"] C["+ CQRS<br/>(Only if scaling requires)"]
H0 -->|"Step 1"| R R -->|"Step 2"| S S -->|"Step 3<br/>(rare)"| C
style H0 fill:#ffcdd2 style R fill:#c8e6c9 style S fill:#bbdefb style C fill:#fff9c41. lépés: csomagolja a kezelőket adattárakba (2-4 óra)
Szekció neve “1. lépés: csomagolja a kezelőket adattárakba (2-4 óra)”- Hozzon létre egy interfészt az adatelérési igényeihez
- Valósítsa meg a meglévő kezelővel
- A
xoops_getmoduleHandler()közvetlen hívása helyett adja be az adattárat
2. lépés: Adjon hozzá szolgáltatási réteget, amikor szükséges (1-2 nap)
Szekció neve “2. lépés: Adjon hozzá szolgáltatási réteget, amikor szükséges (1-2 nap)”- Amikor az üzleti logika megjelenik a vezérlőkben, csomagolja ki egy szolgáltatásba
- A szolgáltatás tárolókat használ, nem közvetlenül kezelőket
- A vezérlők elvékonyodnak (útvonal → szolgáltatás → válasz)
3. lépés: Csak akkor vegye figyelembe a CQRS-t, ha (ritka)
Szekció neve “3. lépés: Csak akkor vegye figyelembe a CQRS-t, ha (ritka)”- Naponta több millió olvasnivalója van
- Az olvasási és írási modellek jelentősen eltérnek egymástól
- Eseménybeszerzésre van szüksége az ellenőrzési nyomvonalhoz
- Van egy csapata, aki tapasztalt a CQRS-val
Gyors referenciakártya
Szekció neve “Gyors referenciakártya”| kérdés | Válasz |
|---|---|
| ”Csak a save/load adatokra van szükségem” | Közvetlen kezelő |
| ”Teszteket akarok írni” | Repository Pattern |
| ”Bonyolult üzleti szabályaim vannak” | Szolgáltatási réteg |
| ”Külön kell méreteznem az olvasmányokat” | CQRS |
| ”Készülök a XOOPS 4.0-ra” | Repository + Service Layer |
Kapcsolódó dokumentáció
Szekció neve “Kapcsolódó dokumentáció”- Repository Pattern Guide
- Service Layer Pattern Guide
- CQRS Mintaútmutató (speciális)
- Hibrid üzemmódú szerződés
#minták #adat-hozzáférés #döntési fa #bevált gyakorlatok #xoops