Documents the whole framework in docs/framework.md, including a
worked tutorial. Building and verifying that tutorial end-to-end
surfaced three real bugs, now fixed:
- MigrateCommand re-ran every migration file on every invocation
instead of skipping ones already logged in the migrations table,
so a second `migrate` always failed once tables existed.
- Router's 404/400/500 handlers sent a 200 OK regardless of the
error, since the returned string was never given the matching
status code.
- Several views (nav login state, product order errors) and
OrderProductController read/wrote the raw $_SESSION superglobal
directly, bypassing the session driver's key prefix, so they
silently never saw values written via session()->put().
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sets sqlite as the default DB_CONNECTION, teaches SqliteMigration how
to alter/drop columns via SQLite's table-rebuild pattern (previously
unsupported), and fixes container startup so the sqlite file is owned
by www-data instead of root (was causing "readonly database" errors
on writes). Also adds phpLiteAdmin on port 8081 for browsing the
sqlite database, with a fix for nginx dropping the port from
absolute-URL redirects.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>