Project tutorial

Build a Symfony Blog

Build Keystone Gazette with Symfony, Twig, Bootstrap, Doctrine, Security form login, owned post CRUD, search, password recovery, and Platform.sh deploy notes.

  • Difficulty Intermediate
  • Parts 12
  • Stack PHP, Symfony, Twig, Bootstrap 5, Doctrine ORM, MySQL 8, Symfony Security

How this project works

Keystone Gazette is an original teaching blog in twelve complete snapshots. Clone once and run any numbered folder without rebuilding earlier stages.

The path starts with Symfony and routing, adds Twig and Bootstrap, then introduces isolated MySQL databases. Later parts add Security, media, ownership, pagination, search, reset tokens, and deploy notes.

Snapshots 4–12 seed [email protected] and [email protected] with password123.

Local MySQL runs through Docker Compose on host port 3309 with databases keystone_01keystone_12.

Start with part 1 Open GitHub repo

Parts in order

Work through the parts in sequence. Each lesson explains the ideas in plain language, then points you to a complete runnable snapshot on GitHub for that stage.

  1. Part 1: Getting StartedCreate a minimal Symfony app on port 8002.
  2. Part 2: RoutingOrganize page routes with attributes.
  3. Part 3: Layout and UIRender Twig pages with Bootstrap 5.
  4. Part 4: Data LayerPersist authors and posts with Doctrine and MySQL.
  5. Part 5: Feed and DetailBuild a database-backed feed and post detail pages.
  6. Part 6: RegistrationValidate accounts and store password hashes.
  7. Part 7: Login and SessionsAuthenticate with Symfony Security form login.
  8. Part 8: Profiles and MediaShow author profiles and accept constrained avatar uploads.
  9. Part 9: Posts CRUD and OwnershipCreate, edit, and delete posts with owner authorization.
  10. Part 10: Pagination and SearchPaginate the feed and search post text.
  11. Part 11: Password ResetIssue expiring one-use password reset tokens.
  12. Part 12: DeployPrepare Keystone Gazette for Platform.sh / Docker with managed MySQL.