Přeskočit obsah
V
Pro vývojáře
Architektura, konvence, jádro systému a bezpečnost
Moduly / Přehled modulů

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.

  1. 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.
  2. Krok musí být idempotentní. Výjimka zastaví anonymizaci jen toho účtu, zapíše se do accountAudit a příští běh cronu to zkusí znovu.
  3. 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í.
  4. 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

Nastavení cookies