Greenfield Symfony 8 CMS engine for PHP-first deployments. No Node.js / npm / node_modules in this repository — not for production and not for local PHP work. Composer + AssetMapper only.
UI (TypeScript/React, including admin pages) is built in webhemi-ui and synced or pulled via NPM as @webhemi/ui. Controllers under assets/react/controllers/ are plain JS re-exports.
- PHP >= 8.4
- Composer 2
- MariaDB/MySQL (default local:
webhemi_dev) or SQLite/PostgreSQL
composer install
php bin/console importmap:install
composer run sync-ui # copies ../webhemi-ui/dist → assets/webhemi-ui
php bin/console doctrine:migrations:migrate -n
# or on a fresh DB after dump-schema:
# php bin/console doctrine:schema:create -n
php bin/console app:seed -n
symfony server:start # or php -S 127.0.0.1:8000 -t publicDefault PHP often caps uploads at 2M. Media library video needs more.
Preferred (Symfony local server): project-root php.ini sets upload_max_filesize / post_max_size to 64M. Restart after changing it:
symfony server:stop
symfony serve -d --port=8000Confirm via /_profiler/phpinfo (dev) or:
# should show 64M under the running server’s PHP, not only CLI
symfony php -r 'echo ini_get("upload_max_filesize"), PHP_EOL;'Optional CLI / system conf.d copy: config/php/99-uploads.ini.
Default seed:
- Admin:
admin@webhemi.local/admin - Site:
main/ Main site - Hosts:
admin.webhemi.local(admin surface),www.webhemi.local(site surface) — both alreadyactiveand assigned tomain(probe skipped for local fixtures) - If missing, writes
var/config/webhemi.yamlwithaccess.admin: domain(template:config/webhemi.yaml.dist)
Map those hosts to 127.0.0.1 in /etc/hosts (or Windows hosts file) for multi-domain smoke tests.
Gitignored runtime settings (defaults if the file is absent: access.admin: path). See hub Admin_API_Access_Mode.md. Copy from config/webhemi.yaml.dist or rely on app:seed.
Operator-created hosts in admin follow pending → verify → assign → active (hub plan); see probe mechanics.
Until @webhemi/ui is published to NPM:
- Develop components in
../webhemi-ui(npm run storybook) cd ../webhemi-ui && npm run buildcomposer run sync-uiin this repo- Refresh the PHP app — AssetMapper serves
assets/webhemi-ui
Production path (after publish): php bin/console importmap:require @webhemi/ui against the registry/CDN, still with zero Node on the VPS.
| Surface | Purpose |
|---|---|
admin |
Dedicated admin host (domain mode); UI at / → /admin |
site |
Public site + /login (frontend auth); path-mode admin at /admin |
Host → surface resolution: App\Routing\HostContextSubscriber.
composer qaRuns lint, PHPCS, PHP CS Fixer (dry-run), Rector (dry-run), PHPStan, PHPCPD, PHPLOC, Deptrac, and PHPUnit.
Optional: composer run qa:psalm
Enable the repository-managed Git hooks (CRLF check + composer run qa on pre-commit):
chmod +x .githooks/pre-commit
git config core.hooksPath .githooks