refactor(autoload): migrate theme classes to Composer PSR-4

Move 288 types from global AKSRT_* + inc/classes manual requires into
namespace AKSRT\{Domain} under src/AKSRT/, wire composer.json psr-4,
and slim bootstrap to helpers/modules/hooks only. Split multi-class
widget/gateway files, update admin contract audit paths, and document
the layout in ADR/README.
This commit is contained in:
2026-07-17 13:29:22 +08:00
parent 8f349b40fb
commit aaf458af1c
404 changed files with 13602 additions and 7705 deletions
+50 -25
View File
@@ -1,37 +1,62 @@
# ADR: Domain folder placement for `inc/classes`
# ADR: Domain folder placement + PSR-4 namespaces for theme types
## Status
Accepted (2026-07-17)
Accepted (2026-07-17); **updated 2026-07-17** for Composer PSR-4.
## Context
After moving root class files into domain folders, freeze placement for boundary types so later moves are intentional.
Domain folders were frozen after the root→domain move. Theme types then migrated from global `AKSRT_*` + manual `require_once` to real PHP namespaces under `src/AKSRT/` with Composer PSR-4.
## Decision
### Domain ownership (unchanged)
| Concern | Domain | Why |
|---------|--------|-----|
| Theme shell (setup, scripts, templates, SEO, meta boxes, DB migrator, front-submit, docs presenter, home modules, stats, redirects, update checker, comment actions) | `core/` | Shared CMS plumbing |
| SPA shell + controllers + schema + native ops | `admin/` | Dual-surface IA |
| Settings facade + runtime delegates | `settings/` | Single public settings API |
| Auth, OAuth, captcha, moderation, email rollback | `auth/` | Identity & access |
| User center/home/badges/level/metrics/notifications/follow | `user/` | Account surface |
| Credits, balance wallet, signin, invite, points-free | `credits/` | Points + cash wallet |
| Download tokens/state, content pay, VIP, visibility | `content/` | Post-centric paid content |
| Topic pay, plate follow pay | `forum/` | Forum SKUs (not generic content pay) |
| Orders, gateways, coupon, charge-card, revenue, creator-revenue, withdrawal, rebate, discount, after-sale, shipping, wechat-notify | `payment/` | Commerce + settlement |
| Shop services/meta/reviews | `shop/` | Product catalog / cart |
| SMS stack | `sms/` | Messaging channel |
| AI runtime (admin AI controller stays in `admin/`) | `ai/` | Generation helpers |
| Message, private message, site notice, report center | `messages/` | In-site messaging |
| MeiliSearch, search-push, ip-geo, content-audit, api-audit | `extensions/` | Optional integrations |
| Widgets + registry | `widgets/` | WP widgets |
| Inline style / custom code / loading overlay | `frontend/` | Asset render helpers |
| Theme shell (setup, scripts, templates, SEO, meta boxes, DB migrator, front-submit, docs presenter, home modules, stats, redirects, update checker, comment actions) | `Core` | Shared CMS plumbing |
| SPA shell + controllers + schema + native ops | `Admin` | Dual-surface IA |
| Settings facade + runtime delegates | `Settings` | Single public settings API |
| Auth, OAuth, captcha, moderation, email rollback | `Auth` | Identity & access |
| User center/home/badges/level/metrics/notifications/follow | `User` | Account surface |
| Credits, balance wallet, signin, invite, points-free | `Credits` | Points + cash wallet |
| Download tokens/state, content pay, VIP, visibility | `Content` | Post-centric paid content |
| Topic pay, plate follow pay | `Forum` | Forum SKUs (not generic content pay) |
| Orders, gateways, coupon, charge-card, revenue, creator-revenue, withdrawal, rebate, discount, after-sale, shipping, wechat-notify | `Payment` | Commerce + settlement |
| Shop services/meta/reviews | `Shop` | Product catalog / cart |
| SMS stack | `Sms` | Messaging channel |
| AI runtime (admin AI controller stays in `Admin`) | `Ai` | Generation helpers |
| Message, private message, site notice, report center | `Messages` | In-site messaging |
| MeiliSearch, search-push, ip-geo, content-audit, api-audit | `Extensions` | Optional integrations |
| Widgets + registry | `Widgets` | WP widgets |
| Inline style / custom code / loading overlay | `Frontend` | Asset render helpers |
### Rules
- Traits live next to owner: `{domain}/{slug}-traits/`.
- Loader: manual `require_once` in `inc/bootstrap.php` only; traits before shells.
- Do not move `topic-pay` / `plate-follow-pay` into `content/` without updating this ADR.
- `creator-revenue` and `wechat-notify` stay under `payment/`.
### PSR-4 layout
- Composer: `"AKSRT\\": "src/AKSRT/"`
- Namespace `AKSRT\{Domain}\…` ↔ path `src/AKSRT/{Domain}/…`
- One type per file; StudlyCaps filename = short class/trait/interface name
- Nested segments: `Admin\Schema`, `Admin\Native`, `Payment\Gateways`, `Admin\Schema\PostList`
- OAuth stays under `Auth` (`AKSRT\Auth\OAuth`) — no separate `oauth/` tree
- Do not move `TopicPay` / `PlateFollowPay` into `Content` without updating this ADR
- `CreatorRevenue` and `WeChatNotify` stay under `Payment`
### Loader
1. `functions.php` loads `vendor/autoload.php` (Composer: third-party + theme PSR-4)
2. `inc/bootstrap.php` loads helpers + procedural modules (`inc/modules/*`) + core-hooks only
3. Singleton `init()` remains in `functions.php` using FQCNs
### Procedural (not PSR-4)
- `inc/helpers/*` function libraries
- `inc/modules/*` (captcha, user-hub/parts, user-notifications, widgets-register, …)
- `inc/core-hooks.php` (+ parts)
### Map tooling
- `php tools/build-psr4-map.php --write` — inventory / map under `tools/psr4-map/`
- Migration helpers under `tools/psr4-*.php` (historical; re-run only with care)
## Out of scope
PSR-4 class namespaces; class renames.
- Dual-read `class_alias` shims for old `AKSRT_*` global names (rewrite references instead)
- Converting all helpers to classes