| Layer | Package |
|---|---|
| Framework | Symfony 8 / PHP 8.5 |
| ORM | Doctrine ORM + Migrations |
| Web auth | Symfony Security (form_login) + symfonycasts/verify-email-bundle + symfonycasts/reset-password-bundle |
| API auth | lexik/jwt-authentication-bundle |
| API docs | API Platform |
| Admin | EasyAdmin 5 |
| Scheduler | Symfony Scheduler (Messenger transport) |
Symfony Mailer (SMTP → localhost:1025, Mailpit UI on localhost:8025) |
|
| Frontend | Webpack Encore + Bootstrap 5 + Bootstrap Icons |
| Web server | Caddy 2 + PHP-FPM (Unix socket) |
| Task runner | mise |
| CI | Dagger (TypeScript module in .dagger/) |
src/ExampleApp/ # PSR-4: ExampleApp\
├── Controller/
│ ├── Admin/ # EasyAdmin dashboard + CRUD
│ ├── Api/ # JWT-protected API endpoints
│ ├── Auth/ # Login, registration, verify email, reset password
│ ├── DashboardController.php
│ ├── HomeController.php
│ └── ProfileController.php
├── DataFixtures/ # Demo data
├── Entity/ # Doctrine entities (User, ResetPasswordRequest)
├── EventSubscriber/ # Email verification gate
├── Form/ # Symfony Form types
├── Repository/ # Doctrine repositories
├── Kernel.php
└── Schedule.php # Symfony Scheduler provider (scheduler_default transport)
templates/
├── admin/
├── auth/ # Login, register, verify pending, reset password
├── dashboard/
├── emails/ # Transactional email templates
├── home/
└── profile/
tests/
├── Unit/ # Entity logic
└── Functional/ # Auth flows, dashboard, JWT API
Supporting directories: config/ (Symfony config), migrations/, assets/ +
webpack.config.js (Encore), .mise/tasks/ (task runner),
.devcontainer/ (Docker setup), .dagger/ (CI module).