Struktura projektu#
Kořen#
| Složka | Obsah |
|---|---|
app/ |
veškerý PHP kód aplikace |
config/ |
konfigurace (NEON) |
www/ |
veřejný kořen, témata, assety, nahrané soubory |
docs/ |
dokumentace — 🔴 servíruje se staticky, mimo aplikaci |
manual/ |
zdroje tohoto manuálu (MkDocs) |
tests/ |
testy |
skills/ |
závazné postupy |
improvements/ |
pracovní zápisky a plány |
_legacy/ |
kód předchozí generace systému |
temp/, log/, var/ |
běhová data |
docs/ je veřejná adresa mimo autorizaci aplikace
Cokoli tam vygenerujete, si kdokoli stáhne — a aplikace se o tom požadavku ani
nedozví, takže se nemá kde zalogovat. Výstupy s daty patří do var/. Podrobně
CORS, rate limit a audit.
app/Core/ — sdílený základ#
| Složka | Obsah |
|---|---|
Base/ |
bázové třídy vrstev, členěné po sekcích + Shared/ |
Bridge/ |
ApiBridge — most mezi Front/Admin a Api |
Traits/ |
sdílené implementace, členěné Shared / Api / Admin / Front / Cron |
Utils/Hydrators/ |
oba hydrátory |
Utils/Filters/ |
skladatelné filtry |
Security/ |
JWT, RBAC, CORS, rate limit |
Forms/ |
jádro formulářů; Form/Parameters/ systém dynamických parametrů |
Latte/ |
rozšíření a makra šablon |
Routers/ |
routování, továrny rout a překladače |
Cache/ |
query cache a cache rout |
Attributes/ |
atributy pro entity a akce |
Integrations/ |
Elasticsearch a další |
Theme/ |
výběr aktivního tématu |
app/UI/ — sekce × modul#
Nejdůležitější rozdělení celého projektu. Sekce určuje vstupní bod, modul určuje doménu.
app/UI/
Front/ ← veřejný web
Api/ ← jediná sekce se skutečným přístupem k databázi
Admin/ ← administrace
Cron/ ← naplánované úlohy
Scripts/ ← jednorázové a údržbové skripty
Script/ ← starší jmenný prostor téhož (jen System)
Error/ ← chybové stránky (Error4xx, Error5xx)
Base/ Bazaar/ Blog/ Comcat/ Discussion/ Eshop/ Invoicer/ Store/ System/
app/UI/Admin/Eshop/ je administrace e-shopu, app/UI/Api/Eshop/ jeho API. Tytéž
tabulky, jiný vstup, jiná pravidla.
Script/ a Scripts/ jsou dvě různé sekce
Namespace určuje doménu překladů, takže presenter v App\UI\Scripts\* hledá
texty v doméně scripts. Založit skript do té druhé znamená, že se texty nenajdou
— a neprojeví se to chybou, jen prázdnými popisky.
Struktura modulu#
app/UI/<Sekce>/<Modul>/
Presenters/
XxxPresenter.php
Traits/
Inits/ inicializace, injektáž, signály tématu
Lists/ výpisy
Details/ detaily
Forms/ formuláře
Pickers/ konfigurace Pickerů (administrace)
Components/
XxxComponent/
Xxx.php XxxFactory.php Traits/ Templates/Default/
Templates/
Models/
Entities/ Managers/ Services/ Mappers/ Repositories/
Generators/ Helpers/ Search/ (podle potřeby)
Presenter má být tenký, logika patří do traitů
Trait na výpis, trait na formulář, trait na detail. Soubor presenteru je pak jen
seznam use, properties a konstruktor — viz Konvence kódu.
Kde je entita třikrát#
Tatáž entita existuje v několika podobách naráz a je to záměr, ne duplicita:
| Kde | Co to je |
|---|---|
app/Core/Base/Shared/<Modul>/Models/Entities/ |
abstraktní předek se sloupci a accessory |
app/UI/Api/<Modul>/Models/Entities/ |
Doctrine entita nad tabulkou |
app/UI/Admin/<Modul>/Models/Entities/ |
co potřebuje administrace |
app/UI/Front/<Modul>/Models/Entities/ |
co potřebuje veřejný web |
Podrobně Hydrátory a Pětivrstvý model.
Legacy#
_legacy/ v kořeni je kód předchozí generace systému. Uvnitř app/ jsou k tomu tři
podsložky Legacy/ — zbytky, které se ještě nepřevedly.
Do legacy kódu nesahejte a nekopírujte z něj vzory
Je označený jako zastaralý a bude odstraněn. Přidáváte-li funkci, napište ji novou
cestou — návod má příslušný skill v skills/. Nebezpečné na tom je, že legacy kód
vypadá jako platný vzor, protože leží v témž projektu.
Kam s novou třídou#
| Píšu | Patří do |
|---|---|
| doménovou logiku | app/UI/Api/<Modul>/Models/Managers/ |
| SQL dotaz | app/UI/Api/<Modul>/Models/Repositories/ |
| procesní orchestraci (checkout, přechod stavu) | manager-tier vedle entitního manageru, ne do Services/ |
| generátor artefaktu (PDF, export) | app/UI/Api/<Modul>/Models/Generators/ |
| čistý výpočet bez I/O | app/UI/Api/<Modul>/Models/Helpers/ |
| obrazovku administrace | app/UI/Admin/<Modul>/Presenters/ |
| naplánovanou úlohu | app/UI/Cron/<Modul>/Presenters/ |
| něco, co potřebují dvě sekce | app/Core/ |
| překladové klíče | app/Locale/<modul>/<locale>/<doména>.<LOCALE>.neon |
Navazující kapitoly: Pětivrstvý model · Konvence kódu · Přehled modulů · Překlady