The stack
- PHP 8.5 on a custom framework built from PSR components: Laminas Diactoros (PSR-7), League Route, PHP-DI (PSR-11), Twig, Doctrine DBAL, Monolog and Phinx for migrations.
- PostgreSQL for data, Redis for cache, sessions and throttling.
- Front end: Vite + TypeScript, UIkit, htmx and Alpine.js — progressive enhancement over server-rendered HTML.
Layout
Modules
Each area of the store is a module undersrc/Modules/, and each module carries its own routes, controllers and models:
Storefront & Catalog
Home, product and category pages, brands, search and filtering.
Cart & Order
Cart, checkout, order lifecycle, returns and payment gateways.
Customer & Pricing
Accounts, the customer cabinet, loyalty points and coupons.
Content & Media
Blog, CMS pages, sliders, uploads and settings.
Requests and safety
Every request flows through a PSR-15 middleware pipeline — including CSRF protection, authentication and role-based access control (RBAC), which guards the/admin and /account areas.
Database writes go through a small repository layer (BaseRepository) with boolean-safe helpers, and a build-time guard (make lint-writes, also run in CI) fails the build if a model bypasses them. It’s a guardrail that keeps Postgres from choking on the little type mismatches that usually surface only in production.
Templates
Views are Twig templates undersrc/App/Frontend/views, styled with SCSS compiled by Vite. Modules and plugins can register their own view paths, so a feature can ship its own templates without editing the shell.