Přeskočit obsah
V
Pro vývojáře
Architektura, konvence, jádro systému a bezpečnost
Začínáme / Struktura projektu

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