Moduly#
Doménové moduly systému. Každý má svou část ve všech sekcích —
app/UI/{Front,Api,Admin,Cron}/<Modul>/.
| Modul | Doména | Entit | Kapitola |
|---|---|---|---|
| System | uživatelé, platby, nastavení, číselníky, assety | 90 | — |
| Eshop | zboží, košík, objednávky, reklamace, feedy | 84 | E-shop |
| Bazaar | inzerce | 34 | Inzerce |
| Comcat | katalog firem | 33 | Katalog firem |
| Blog | články, novinky, akce, galerie, kniha návštěv | 29 | Blog |
| Invoicer | fakturace | 28 | Fakturace |
| Company | vlastní firma — prezentace, termíny, zakázky | 25 | Moje firma |
| Base | sdílené — komentáře, hodnocení, ankety, newsletter, reklamní plochy, soukromé zprávy | 22 | Soukromé zprávy |
| Store | sklad | 13 | Sklad |
| Discussion | fórum | 13 | Diskuze |
Počty jsou Api entity — ls app/UI/Api/<Modul>/Models/Entities/*.php | wc -l. Sekci
Front nemá jediný modul: Invoicer, protože doklady se návštěvníkovi nezobrazují
samostatně, jen jako soubor ke stažení u objednávky.
Kudy začít#
| Chci | Začni tady |
|---|---|
| poprvé se v modulech zorientovat | Blog — je nejmenší z těch „normálních“ a je zároveň vzorem |
| napsat nový zdroj pro vyhledávání | ArticleDocumentSource.php z blogu |
| pochopit dynamická pole | Inzerce |
| pochopit peníze a stavy | E-shop → Sklad → Fakturace v tomhle pořadí |
Společné vzory#
Většina modulů sdílí tytéž vzory — když je poznáte v jednom, poznáte je všude:
| Vzor | Kde se objevuje | Kde je popsaný |
|---|---|---|
| dynamické parametry místo pevných sloupců | Bazaar, Comcat, Eshop | Inzerce |
| stromové kategorie (nested set) | Bazaar, Comcat, Discussion, Eshop, Blog, Company | Inzerce |
| denormalizované počítadlo + přepočet cronem | všude, kde je strom | Inzerce |
| tarify a platební položky | Bazaar, Comcat, Discussion | Diskuze |
zvýraznění časem (toped_until) |
Bazaar, Comcat, Discussion | Inzerce |
| stavový automat s příznaky akcí | Eshop (objednávka, reklamace) | E-shop |
| doklad jako otisk | Invoicer, Store | Fakturace |
| zdroj pro Elasticsearch | Blog, Bazaar, Comcat, Discussion, Eshop | Elasticsearch |
Comcat a Company jsou dva různé moduly, ne dvě části jednoho
Comcat je katalog cizích firem (kopie Bazaaru), Company je vlastní firma
provozovatele. Nesdílí ani jednu tabulku a nemají společný předek — jen si jsou
podobné jménem. Oprava v jednom se ve druhém neprojeví, takže hlášení „nefunguje to
u firem" je vždycky potřeba nejdřív rozřadit.
Comcat vznikl kopií Bazaaru
Jsou si velmi podobné. Řešíte-li něco v jednom, podívejte se, jestli to není
i v druhém — a jestli tam oprava nechybí. Zápisek o vzniku je
v docs/comcat-copy-from-bazaar.md.
Podobnost ale není totožnost
Comcat nemá price, sold ani sledující, a jeho generovaný sloupec active má
o jednu podmínku míň. Kopírovaný SQL dotaz nebo PHP getter proto může selhat —
přehled rozdílů je v Katalogu firem.
Sdílené prvky z Base#
Komentáře, hodnocení, ankety, newsletter a reklamní plochy jsou jedna implementace
pro všechny moduly (app/UI/Api/Base/).
Oprava sdílené komponenty zasáhne všechny moduly naráz
Změna v hodnocení se projeví u produktů, inzerátů, firem i příspěvků. Projděte všechny, ne jen ten, kvůli kterému opravujete — a počítejte s tím, že tři ze čtyř nikdo neotestuje, pokud si to neřeknete sami.
Zapojení modulu do systémových toků#
Některé toky vlastní modul System, ale data k nim mají ostatní moduly. Modul se do nich zapojí novou třídou s rozhraním — DI ji najde podle typu a System modul se nemění.
| Rozhraní | Tok | Existující implementace |
|---|---|---|
App\Core\Security\AccountAnonymizationStepInterface |
anonymizace zrušeného účtu | app/UI/Api/{Bazaar,Comcat,Base,Discussion}/Models/Managers/AccountAnonymizationManager.php |
App\Core\Payments\Express\ExpressServiceProviderInterface |
služba placená jednou expresní SMS | app/UI/Api/{Bazaar,Comcat,Discussion,System}/Payments/*ExpressServiceProvider.php |
Krok anonymizace účtu#
interface AccountAnonymizationStepInterface
{
/** @return array<string, int> co se změnilo, pro audit (např. bazaarAdvertsDeactivated => 2) */
public function anonymizeUser(int $userId, string $originalEmail, string $deletedLabel): array;
}
AccountDeletionManager dostane všechny implementace polem z DI a zavolá je před
přepsáním řádku uživatele, takže $originalEmail je ještě původní (vazba odběru novinek je
jen přes e-mail). $deletedLabel je přeložené „Smazaný uživatel“ pro kopie jména autora.
- Třída patří do Api vrstvy modulu (manager-tier) a pracuje přímo s managery a SQL — bez bridge a bez RBAC, cron běží bez identity.
- Krok musí být idempotentní. Výjimka zastaví anonymizaci jen toho účtu, zapíše se do
accountAudita příští běh cronu to zkusí znovu. - Obsah deaktivuj, nemaž. Inzeráty a profily se deaktivují (a přeindexují), příspěvky zůstávají se jménem „Smazaný uživatel“; doklady a platby se nemění.
- Vrať počty změn — skončí v auditním logu.
Expresní SMS služba modulu#
Modul, který prodává službu placenou jednou SMS, dodá provider s getModuleCode(),
resolve(), createPaymentItems() a describe(). Celý postup včetně společného základu
pro moduly s rychlými cenami je v Expresních SMS platbách.
Kam sáhnout#
| Chci | Kde |
|---|---|
| sdílené entity | app/UI/Api/Base/Models/Entities/ |
| sdílené base entity modulů | app/Core/Base/Shared/<Modul>/Models/Entities/ |
| cron úlohy modulu | app/UI/Cron/<Modul>/Presenters/ |
| zdroje pro vyhledávání | app/UI/Api/<Modul>/Models/Search/ |
Navazující kapitoly: Pětivrstvý model · Struktura projektu · Elasticsearch · Naplánované úlohy